Building Machine Learning System with Python ch.2.3

좀 더 복잡한 데이터셋과 분류기

전보다 더 큰 데이터셋인 농업데이터 셋을 보자.
7가지 속성으로 이뤄져 있다.

1. 크기
2. 둘레
3. 다짐도
4. 씨앗의 길이
5. 씨앗의 너비
6. 비대칭도
7. 씨앗 홈의 길이

세 가지 밀의 종류에 따라 캐나디안, 카마, 로사라는 세 가지 범주로 나눈다. 
앞서와 마찬가지로 형태학적 측정 값으로 종을 나누는 게 목표이다. 


속성과 속성 엔지니어링

기존 속성에서 새로운 속성을 이끌어내는 일을 속성 엔지니어링이라 한다.
처음에 얘기했듯이 잘 선택된 속성으로 수행한 단순한 알고리즘은 그저 그런 속성으로 수행한 뛰어난 알고리즘보다 좋은 결과를 낸다.

어떤 속성이 좋은 지 구별하기 위해서는 기반 지식을 사용할 필요가 있다.
자연스러운 질문은 좋은 속성을 자동으로 선택할 수 있는가이다. 
이러한 문제를 속성 선택이라 한다. 제안된 여러 가지 방법들이 존재한다.


scikit-learn 으로 분류

scikit-learn 분류 API는 분류기별로 잘 구성되어 있다. 
이러한 분류기에는 다음 두 기본 메소드가 있다.

1. fit(features, labels) : 이 메소드는 학습하는 단계로, 모델의 매개변수를 적합화한다.
2. predict(features) : 이 메소드는 fit 함수를 호출한 후로 사용할 수 있으며
하나 이상의 예제에 대한 예측을 반환한다.

from sklearn.neighbors import KNeighborsClassifier

classifier = KNeighborsClassifier(n_neighbors=1)

from sklearn.cross_validation import KFold

kf = KFold(len(features), n_folds=5, shuffle=True)
means = []
for training,testing in kf:
   # 이 중첩에 대해 모델을 적합화하고 predict로 데이터를 테스트한다
   classifier.fit(features[training], labels[training])
   prediction = classifier.predict(features[testing])

   # 이 중첩에서 정확히 예측한 것에 대해 불 배열에 넣고 np.mean 한다:
   curmean = np.mean(prediction == labels[testing])
   means.append(curmean)
print('Mean accuracy: {:.1%}'.format(np.mean(means)))

classifier 변수에 이웃의 수인 1 옵션으로 설정한다.
k-fold 교차 검증을 통해 트레이닝 셋을 훈련시키고 테스트 셋에 실험해본 후
오차의 평균을 구해 출력한다.

결정선 살펴보기

모든 속성 값을 공통의 범위로 정규화할 필요가 있다.
많은 해결책 중에 Z 점수로 정규화하는 방법이 간단한다.
Z 점수는 표준 편차를 단위로 하여 평균값에서  얼마나 멀리 떨어져 있는가를 나타내는 간단한 연산이다.

f' = (오래된 값-평균)/표준편차

scikit-learn 모듈로 전처리 단계로서 이 정규화를 쉽게 사용할 수 있다.
pipeline 과 standardscaler 모듈을 임포트해야한다. 

>>> from sklearn import svm
>>> from sklearn.datasets import samples_generator
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import f_regression
>>> from sklearn.pipeline import Pipeline
>>> # generate some data to play with
>>> X, y = samples_generator.make_classification(
...     n_informative=5, n_redundant=0, random_state=42)
>>> # ANOVA SVM-C
>>> anova_filter = SelectKBest(f_regression, k=5)
>>> clf = svm.SVC(kernel='linear')
>>> anova_svm = Pipeline([('anova', anova_filter), ('svc', clf)])

위는 pipeline의 예제이다. 두 가지의 연산을 병렬적으로 처리하는 모듈이다.

standardscaler는 전처리 모듈 중 하나로서
분산이나 평균을 알 수 있는 모듈이다.


이 2장을 통해 속성 엔지니어링과 전처리 작업의 중요성을 깨닫는 장이었다.
머신러닝 인 액션을 했더니 알고리즘적인 부분은 설명이 불충분하고 예제 위주인 것 같다.

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리