머신러닝

사이킷런으로 퍼셉트론 학습

김천종 2022. 11. 17. 14:35
반응형

사이킷런 라이브러리에는 많은 유용한 클래스, 메소드 등이 포함되어있다.

사이킷런을 이용해서 머신러닝을 진행하는 기초적인 순서는 다음과 같다.

 

### 데이터셋 로드 ###

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from sklearn import datasets
import numpy as np
 
iris = datasets.load_iris()
# sklearn 라이브러리에서 제공하는 붓꽃데이터셋 로드
 
= iris.data[:, [2,3]]
# X(입력데이터) 는 2열, 3열의 데이터로 한정
 
= iris.target
# y(출력데이터) 는 타겟데이터 (붓꽃 레이블)
 
print(np.unique(y))
''' 고유값을 출력해보니 라이브러리에서 제공하는 데이터셋에는 이미
    레이블이 0, 1, 2로 정수레이블로 변환되어있다.
[0 1 2]
'''
# 문자열 레이블로 사용할 수 있지만 계산성능을 향상시키기 위해서 정수레이블로
# 변환한 후 학습을 진행하는 것을 권장하고 있다.
cs

 

 

 

### 훈련데이터와 테스트데이터 나누기 ###

1
2
3
4
5
6
7
8
9
from sklearn.model_selection import train_test_split
 
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size = 0.3, random_state = 1, stratify = y)
# 훈련 데이터와 테스트 데이터를 나누는 메소드
# test_size= 0.3 : 훈련 70%, 테스트 30% 로 데이터를 나눔
# random_state = 1 : 데이터셋을 무작위로 섞어서 데이터를 나눔
# stratify = y : 훈련 데이터와 테스트 데이터의 클래스 레이블 비율을 
# 입력 데이터와 동일하게 만듬
cs

 

 

 

### 데이터 표준화 ###

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.preprocessing import StandardScaler
 
sc = StandardScaler()
# 사이킷런 라이브러리의 데이터 표준화 객체
 
sc.fit(X_train)
# X_train 데이터의 평균, 표준편차를 사용해서 표준화
 
X_train_std = sc.transform(X_train)
# X_train을 표준화 한 후 X_train_std에 저장
 
X_test_std = sc.transform(X_test)
# X_test을 표준화 한 후 X_test_std에 저장
cs

 

 

 

### 퍼셉트론 훈련 ###

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from sklearn.linear_model import Perceptron
 
ppn = Perceptron(eta0=1, random_state=1, max_iter= 10)
# 사이킷런 라이브러리가 제공하는 퍼셉트론 객체 생성, 학습률= 0.1, 학습횟수 = 10
 
ppn.fit(X_train_std, y_train)
# 표준화된 입력 X_train_std와 출력을 사용해서 퍼셉트론 학습
 
y_pred = ppn.predict(X_test_std)
# X_test_std 테스트 데이터를 사용해서 테스트 결과 예측
 
print("잘못 분류된 데이터 %d개" %(y_test != y_pred).sum())
# 퍼셉트론을 이용해서 예측한 y_pred와 기존의 테스트 데이터 y_test를 이용해서
# 잘못 분류된 데이터가 몇개인지 출력
# 넘파이의 불린 자료는 Ture = 1, False = 0 으로 취급하기 때문에
# sum() 메소드를 사용하면 Ture의 개수가 몇 개인지 확인할 수 있다.
'''
잘못 분류된 데이터 1개
'''
cs

 

 

 

### 훈련의 정확도 확인 ###

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.metrics import accuracy_score
 
print("정확도 : %3f" %accuracy_score(y_test, y_pred))
# accuracy_score 를 사용해서 정확도 출력
'''
정확도 : 0.977778
'''
 
print('정확도: %3f' %ppn.score(X_test_std, y_test))
# .score() 메소드로 정확도를 출력할 수도 있다.
'''
정확도: 0.977778
'''
cs

 

 

 

### 시각화 ###

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
 
def plot_decision_regions(X, y, classifier, resolution=0.02):
    markers = ('s''x''o''^''v')
    colors = ('red''blue''lightgreen''gray''cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])
    
    x1_min, x1_max = X[:, 0].min() -1, X[:, 0].max()+1
    x2_min, x2_max = X[:, 1].min() -1, X[:, 1].max()+1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                           np.arange(x2_min, x2_max, resolution))
    z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    z = z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, z, alpha=0.3, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())
    
    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y == cl, 0],
                    y=X[y==cl, 1],
                    alpha=0.8,
                    c=colors[idx],
                    marker= markers[idx],
                    label=cl,
                    edgecolors='black')
        
 
plot_decision_regions(X_train_std, y_train, classifier=ppn)
plt.show()
cs

 

결과

반응형