이미 말했듯이 퍼셉트론이나 이를 발전시킨 아달라인은 머신러닝을 위한 트레이닝 데이터가 완전히 선형 분리가 되어 있지 않으면 제대로 된 머신러닝을 수행할 수 없습니다. 하지만 우리가 접하는 대부분의 데이터들은 선형 분리가 불가능한 것들이며, 이런 이유로 머신러닝을 위한 방법으로써 퍼셉트론은 실제로 잘 활용되지는 않습니다.
그렇지만 퍼셉트론은 분류(classification)를 위한 다양한 알고리즘의 개발과 발전에 기초 개념을 제공했다는 것만으로도 매우 가치가 있는 것이죠~
다양한 분류 알고리즘 중, 해결하고자 하는 문제에 최적인 알고리즘을 선택하는 일은 경험이 필요합니다. 이 분류 알고리즘으로 트라이 해보고, 저 분류 알고리즘으로 한번 트라이 해보고, 이런 식으로 다양한 분류 알고리즘을 적용하여 가장 최적인 결과가 나오는 것을 선택하는 것이죠. 이 후, 이와 유사한 작업을 할 경우에는 최적인 알고리즘을 채택해서 적용하게 되는 것입니다. 따라서 우리가 획득하고 트레이닝 시킬 데이터의 종류에 따라 최적인 분류 알고리즘을 찾는 것이 중요합니다.
분류를 위한 머신러닝을 수행할 때 일반적으로 아래의 단계를 따릅니다.
- 트레이닝 데이터에서 트레이닝을 수행할 적절한 특성(feature)값(실제 머신러닝을 위해 입력되는 값) 선택하기
- 성능 메트릭(performance metric) 선택하기
- 분류기(classifier)를 선택하고 알고리즘 최적화하기
- 머신러닝 성능 측정하기
- 알고리즘 튜닝하기
위에서 설명한 각 단계의 자세한 내용은 차근차근 진행하도록 하도록 하고, 이번 포스팅에서는 우리가 이미 직접 파이썬으로 구현해보았던 퍼셉트론을 scikit-learn API를 이용해 수행해보는 것입니다.
scikit-learn은 파이썬으로 구현한 머신러닝을 위한 확장 라이브러리입니다. scikit-learn은 아래와 같이 머신러닝을 위한 다양한 API를 제공합니다.
- Classification
- Regression
- Clustering
- Dimensional reduction
- Model selection
- Preprocessing
이와 관련한 많은 내용을 알고 싶다면 scikit-learn 공식 사이트를 방문해서 살펴보도록 하세요~
여러분의 컴퓨터에 scikit-learn이 아직 설치되어 있지 않았다면 윈도우 명령 프롬프트를 실행하고 다음과 같이 pip를 이용해 scikit-learn을 설치합니다.
pip install scikit-learn
자 그러면 아래의 코드를 작성하고 skl_perceptron0.py로 저장합니다.
skl_perceptron0.py
>>> from sklearn import datasets
>>> from sklearn.cross_validation import train_test_split
>>> from sklearn.preprocessing import StandardScaler
>>> from sklearn.linear_model import Perceptron
>>>from sklearn.metrics import accuracy_score
scikit-learn의 필요한 모듈을 임포트합니다.
이후에 등장하는 코드는 이전 포스팅에서 퍼셉트론이나 아달라인을 잘 이해했다면, scikit-learn에서 제공하는 API를 이용하는 것 이외에는 거의 동일한 프로세스로 머신러닝을 수행하게 됩니다.
>>> iris = datasets.load_iris()
scikit-learn에는 이전 포스팅에서 학습 데이터로 다루었던 아이리스에 대한 데이터를 자체적으로 가지고 있습니다. 이 데이터는 datasets 모듈의 load_iris() 함수를 통해 읽어올 수 있는데, scikit-learn에서 정의한 특이한 클래스 형태로 저장되어 있습니다.
>>> X = iris.data[:, [2, 3]]
>>> y = iris.target
X에 아이리스 데이터에서 꽃잎길이와 꽃잎너비 데이터를 대입합니다. 그리고 y에는 품종 데이터를 담습니다. y를 화면에 출력해보면 알겠지만 y에 저장된 아이리스 품종데이터는 0, 1, 2의 값으로만 구성되어 있습니다. 이는 iris-setosa, iris-versicolor, iris-verginica에 해당하는 값입니다. 즉, scikit-learn에서 품종 데이터를 이미 숫자로 바꾸어 저장해둔 것입니다.
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=0)
train_test_split()은 원래 트레이닝 데이터와 결과값인 X와 y를 무작위로 섞은 후 test_size로 주어진 비율만큼 각각 나눕니다. 예를 들어 test_size = 0.3으로 되어 있으면 X와 y를 무작위로 섞은 후에 70%는 X_train과 y_train으로, 나머지 30%는 X_test, y_test로 둡니다. random_state의 값은 난수 발생을 위한 seed의 인자값입니다.
아이리스 데이터를 70%는 트레이닝 데이터로, 나머지 30%는 테스트 데이터로 나누는 이유는 70%의 데이터로 머신러닝을 수행하여 학습이 마무리되면, 나머지 30%의 데이터에 대한 예측값과 실제 결과값을 비교함으로써 머신러닝이 얼마나 잘되었는지 확인하기 위함입니다.
>>> sc = StandardScaler()
scikit-learn의 preprocessing 모듈이 제공하는 StandardScaler()는 표준화를 적용하기 위한 클래스입니다. 표준화에 대해서는 이미 이전 포스팅에서 자세히 다루었습니다.
>>> sc.fit(X_train)
X_train의 평균과 표준편차를 구합니다.
>>> X_train_std = sc.transform(X_train)
>>> X_test_std = sc.transform(X_test)
X_train과 X_test를 표준화한 데이터를 각각 X_train_std, y_test_std에 대입합니다.
>>> ml = Perceptron(eta0=0.01, n_iter=40, random_state=0)
>>> ml.fit(X_train_std, y_train)
scikit-learn의 linear_model에는 머신러닝을 위한 다양한 선형모델 알고리즘들을 제공합니다. 여기에는 Perceptron 클래스도 포함되어 있습니다. learning rate을 0.01로 두고 퍼셉트론 객체를 생성합니다. X_train과 y_train을 이용해 머신러닝을 수행합니다.
>>> y_pred = ml.predict(X_test_std)
퍼셉트론으로 머신러닝을 수행한 후 X_test_std를 이용해서 이에 대한 예측값을 계산하고 y_pred로 둡니다.
>>> print('총 테스트 개수:%d, 오류개수:%d' %(len(y_test), (y_test != y_pred).sum()))
테스트 값에 대한 실제 결과값인 y_test와 머신러닝을 수행한 퍼셉트론에 의해 예측된 값인 y_pred를 비교하여 다른 값을 가진 개수를 출력합니다.
>>> print('정확도: %.2f' %accuracy_score(y_test, y_pred))
scikit-learn의 metrics 모듈에서 제공하는 accuracy_score()는 인자에 y_test, y_pred를 순서대로 입력하면 y_test와 y_pred를 비교하고 값이 같은 비율, 즉 정확도를 계산해줍니다.
이 코드를 수행하면 아래와 같은 결과가 나옵니다.
총 테스트 개수: 45, 오류개수: 4
정확도: 0.91
다음 포스팅에서 실제 아이리스 트레이닝 데이터가 어떻게 분포하는지 산점도로 그래프를 그려보고, 퍼셉트론 머신러닝에 의해 학습된 분류가 어떻게 이 데이터들을 구분하는지 그 영역을 그래프로 그려서 확인하고 그 유효성에 대해 살펴보도록 하겠습니다.
'책 리뷰 > Python Machine Learning' 카테고리의 다른 글
[12편] scikit-learn 로지스틱 회귀 (0) | 2017.12.14 |
---|---|
[11편] scikit-learn 퍼셉트론의 유효성 확인 (0) | 2017.12.14 |
[9편] 확률적 경사하강법을 적용한 아달라인 구현하기 (0) | 2017.12.14 |
[8편] 표준화를 이용하여 성능이 향상된 아달라인 구현하기 (0) | 2017.12.14 |
[7편] 단순 인공신경망 아달라인을 파이썬으로 구현하기 (0) | 2017.12.14 |