make_moons (from sklearn.datasets)
초승달 모양 클러스터를 2개 생성하는 함수
X, y = make_moons(n_samples=2000, noise=0.1, random_state=925)
위처럼 사용 가능하다.
noise에 따라서 분포가 달라지고, random_state는.. 솔직히 모르겠다.
튜플을 반환하는데, X는 점들의 좌표가 담긴 2차원 배열, y는 라벨을 의미한다.
matplotlib
시각화 도구
import matplotlib.pyplot as plt
plt.scatter
2차원 점들의 분포를 표현하는 함수
plt.scatter(x1, x2, c=y, marker='.', cmap='tab10')
제일 앞의 두 인자는 x, y좌표를 넣으면 된다.
c는 색깔을 지정하는 파라미터. 라벨에 대한 배열을 넣어서 라벨별로 색을 구분하는 용도로도 사용이 가능하다. 그럴려면 cmap을 사용해서 색 배치를 셋팅한다.
marker는 점을 표시하는 방법. 0이나 ,을 넣으면 그때그때 달라진다.
label 파라미터는 넣으면 오른쪽 위에 라벨이 나타남. 나타내려면 plt.legend()를 호출해야 함.
plt.plot
2차원 점들을 선으로 연결해서 표현하는 함수
plt.plot(x1_0, x2_0, c='b', marker='.', label='0')
사용법은 scatter와 같다.
plt.subplots
서로 다른 그래프들을 한 번에 보여주는 함수
fig, axes = plt.subplots(5, 4, figsize=(20,10))
5 x 4개의 그래프들을 하나의 틀에 담는다.
반환값으로는 figure와 axe가 나오게 되는데, 외부의 틀을 figure, 내부의 그래프들을 axe라고 한다.
figsize=(20,10)으로 한 것도 figure의 크기를 조정한 것이다.
GaussianNB
naive_bayes 분류기의 일종
from sklearn.naive_bayes import GaussianNB as GNB
model = GNB()
model.fit(X, y)
위 코드처럼 import해서 GNB()로 model에 분류기를 할당한다.
그리고 fit함수로 학습시킨다.
X는 feature(data), y는 label이다. (지도 학습)
학습 결과
res = model.predict(X)
분류기가 학습한 결과를 model.predict(feature)로 불러올 수 있다.
우선 순위 반영
model = GNB(priors=[.99, .01])
model.fit(X, y)
어떤 라벨에 우선순위를 반영할 수 있다.
우선순위를 부여한 후에 fit()으로 학습을 시키면 가중치를 반영해서 학습한다.
make_moons로 만든 데이터의 경우, 클래스가 2개 뿐이므로 priors의 크기는 2로 설정한다.
궁금한 점은... 레이블을 10, 11로 설정해도 클래스를 0, 1로 인식하던데.. 왜 그럴까. 사전순으로 정렬해서 알아서 인식하는 건가?
Pandas
데이터 분석 라이브러리
import pandas as pd
보통 이렇게 해서 쓴다.
데이터 불러오기
iris = pd.read_csv("./iris.csv")
read_csv 함수를 이용해서 csv 확장자의 데이터를 가져올 수 있다.
데이터 화면에 띄우기
iris # == print(iris)
iris.head(n)
할당한 변수를 이용해서 불러온 데이터를 화면에 띄울 수 있다. print(iris)와 같다.
head 함수를 이용해서 불러온 데이터의 상위 n개만 화면에 띄울 수 있다. n의 default는 5.
데이터 조회하기
iris = pd.read_csv("./data/iris.csv")
print(iris['petal_length'])
print(iris.loc[0])
print(iris['species'][2])
print(iris[['sepal_length', 'species']][2:5])
colume을 기준으로 딕셔너리처럼 사용할 수 있다. 반환되는 결과는 Series. 대괄호 두 개로 감싸면 datagram. 이거는 더 공부해보자.
row를 기준으로 뽑고 싶다면 loc를 사용하면 된다.
만약 특정 열, 특정 행을 뽑아오고 싶다면 2차원 배열의 형태를 쓰면 된다.
다중 열을 뽑고 싶다면 string 배열을, 다중 행을 뽑고 싶다면 slicing을 사용하면 된다.
데이터 삭제
iris.drop(labels='id', axis=1, inplace=True)
labels는 삭제하고 싶은 행 혹은 열의 이름을 넣어주면 된다.
axis = 0이면 행을, axis = 1이면 열을 삭제하게 된다.
inplace이 True면 drop하는 주체에 데이터 삭제를 진행하게 된다.
inplace를 False로 하고 iris에 drop 결과를 저장하고 싶다면, iris = iris.drop(labels='id', axis=1)와 같이 저장하면 된다.
라벨 인코딩
scikit-learn의 머신러닝 API들은 Feature나 Label의 값들이 정수나 실수인 것만 처리할 수 있기 때문에, 문자열일 경우 숫자형으로 변환하여 처리해야 한다.
from sklearn.preprocessing import LabelEncoder
iris = pd.read_csv("./data/iris.csv")
temp = iris['species']
enc = LabelEncoder()
enc.fit(temp)
iris['species'] = enc.transform(temp)
species 열에는 문자열 데이터가 들어있기 때문에 라벨 인코딩을 해줘야 한다.
인코딩을 해줄 인코더를 import해주고 enc에 인코더를 저장한다.
그리고 인코더에게 문자열 데이터가 들어간 배열을 학습시킨다.
학습이 완료되었으니 인코더를 사용해서 문자열 데이터들에 대해 라벨 인코딩을 transform 함수로 진행하여 나온 배열을 species 열에 대입하여 인코딩을 완료한다.
product
중복 순열을 뽑을 수 있는 함수
pairs = product(range(3), range(3))
for i, j in pairs:
print(i, j)
위의 코드를 실행시키면 (0,0)부터 (2,2)까지의 중복 순열을 pairs에 저장한다. 파라미터의 개수를 늘리면 길이가 n인 중복 순열을 얻을 수 있다.