솔직히 seaborn iris 데이터 너무 노잼이다. 좀 재밌는 데이터였다면 좀 더 즐거웠을까. 

각설하고, iris 데이터의 종을 분류해보자. 

- MLPClassifier를 이용한다.

MLPClassifier란?

다층 퍼셉트론 분류기 (Multi Layer Perceptrons Classifier).
MLPClassifier는 다중 분류, 다중 레이블 분류를 지원한다. MLPClassifier 클래스는 겉으로 드러나지는 않지만, 타깃 배열 y의 차원을 보고 출력 뉴런의 개수를 자동으로 결정한다.

참고 글 : MLPClassifier의 다중 레이블 분류, Multi Layer Perceptrons

- 교차분류표와 정확도(accuracy)를 출력한다.




실습_20200701

1. iris 데이터의 종을 분류해보자.

In [1]:
import seaborn as sns
In [2]:
# seaborn 패키지를 이용해 iris 데이터를 불러온다. 
# seaborn 패키지에 있는 여러 데이터 세트 : https://github.com/mwaskom/seaborn-data
iris = sns.load_dataset("iris")
In [3]:
iris.head()
Out[3]:
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
In [22]:
# 라벨인코더 함수로 종(species) 정보를 레이블 인코딩한다. 
# sklearn.preprocessing에 있는 LabelEncoder 함수는 문자를 0부터 시작하는 int형 숫자로 바꿔준다. 
# 라벨 즉, 코드 숫자를 이용해 원본 텍스트를 구할 수 있어 카테고리형 데이터를 수치형으로 변환할 때 많이 사용된다.
from sklearn.preprocessing import LabelEncoder 
In [23]:
# 라벨 인코더 생성
le = LabelEncoder()
In [24]:
# 학습(fit) : 분석적인 접근법으로 학습 알고리즘을 데이터에 적용하는 것
le.fit(iris.species)
Out[24]:
LabelEncoder()
In [25]:
# transform 기능을 이용해 범주형을 숫자로 변환한다. 
iris.species = le.transform(iris.species)
In [11]:
from sklearn.model_selection import train_test_split
In [26]:
iris.head()
Out[26]:
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0
  • 독립변수와 종속변수로 나눈 후 다시 학습용 데이터와 검증용 데이터로 나눈다.
In [28]:
iris_X = iris.iloc[:,:-1] # 독립변수들 // # DF.iloc[행 시작 번호(:행 끝 번호), 열 시작 번호(:열 끝 번호)]
iris_y = iris.species     # 종속변수 iris.iloc[:,-1] 
In [30]:
# 학습 데이터의 일부를 validation dataset으로 사용하기 위해 train_test_split() 사용
from sklearn.model_selection import train_test_split 
In [31]:
train_X, test_X, train_y, test_y = train_test_split(iris_X, iris_Y, test_size = 0.3, random_state=23)
  • MLPClassifier 클래스를 이용해 분류모형을 만들고 학습시킨다.
In [32]:
from sklearn.neural_network import MLPClassifier
In [33]:
mlp = MLPClassifier(hidden_layer_sizes=(50, 60, 30), max_iter=500)
In [34]:
mlp.fit(train_X, train_y)
Out[34]:
MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,
              beta_2=0.999, early_stopping=False, epsilon=1e-08,
              hidden_layer_sizes=(50, 60, 30), learning_rate='constant',
              learning_rate_init=0.001, max_fun=15000, max_iter=500,
              momentum=0.9, n_iter_no_change=10, nesterovs_momentum=True,
              power_t=0.5, random_state=None, shuffle=True, solver='adam',
              tol=0.0001, validation_fraction=0.1, verbose=False,
              warm_start=False)
  • 검증용 데이터를 이용해 종을 예측한다.
In [36]:
pred = mlp.predict(test_X)
pred
Out[36]:
array([2, 2, 1, 0, 2, 1, 0, 2, 0, 1, 1, 0, 2, 0, 0, 1, 1, 1, 2, 0, 2, 0,
       0, 0, 2, 0, 0, 2, 1, 1, 0, 1, 0, 2, 0, 0, 1, 1, 1, 2, 2, 0, 1, 0,
       1])
  • 교차분류표를 만들고 출력한다.
In [37]:
import pandas as pd
In [40]:
pd.crosstab(test_y, pred, rownames=['True'], colnames=['Pred'], margins=True) # margins=True : 교차표의 행 합, 열 합 추가하기
Out[40]:
Pred 0 1 2 All
True
0 18 0 0 18
1 0 14 0 14
2 0 1 12 13
All 18 15 12 45
In [41]:
print(mlp.score(test_X, test_y))
0.9777777777777777