컴공돌이의 스터디 블로그

[Iris_4] - Iris DataSet에 Logistic Regression 사용해 보기 본문

Machine Learning 실습/Iris

[Iris_4] - Iris DataSet에 Logistic Regression 사용해 보기

제갈초아 2018. 4. 2. 12:00

* 이 글은 Iris DataSet을 이용한 실습 과정을 정리한 글입니다.


Iris DataSet에 Logistic Regression 사용해 보기


   Iris DataSet에 사용할 수 있는 많은 Classifier 중에서 이번 글에서는 Logistic Regression에 대해서 알아보겠습니다. Logistic Regression은 sklearn 패키지에 구현되어 있기 때문에 간편하게 사용이 가능하지만 함수를 자세히 살펴본다면 함수 내부의 파라미터 값을 조절 할 수 있고 이 값을 조절 해줌으로써 성능이 향상될 수도 하락할 수도 있습니다. 이번 글에서는 단순한 Default 값의 파라미터들을 사용하는 것이 아닌 몇개의 파라미터들 중에서 Iris DataSet에 가장 좋은 성능을 가질 수 있는 파라미터로 실습을 해보겠습니다.


  우선 데이터를 가져오는 방법은 앞의 글들과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.datasets import load_iris
from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
 
Iris = load_iris()
 
Iris_Data = pd.DataFrame(data= np.c_[Iris['data'], Iris['target']], columns= Iris['feature_names'+ ['target'])
Iris_Data['target'= Iris_Data['target'].map({0"setosa"1"versicolor"2"virginica"})
 
X_Data = Iris_Data.iloc[:,:-1]
Y_Data = Iris_Data.iloc[:,[-1]]
cs


  가져온 데이터들 중 X_Data는 4개의 변수들로 구성되어 있습니다. 이번 실습에서는 2개의 변수만 사용해서 실습을 해보겠습니다. 먼저 2개의 변수를 고르고 Y_Data를 이루고 있는 Class를 정수형 변수로 바꿔주는 코드를 사용하면 아래와 같습니다.


1
2
= X_Data.iloc[:,[0,1]].values
= Y_Data["Class"].map({'Setosa'0'Versicolor'1'Virginica':2}).values
cs


  위의 그림과 같이 Logistic Regression에서 사용할 데이터를 준비 한 후에 최적의 모델을 찾는 방법에 대해서 알아보겠습니다. 파라미터들을 일일이 넣어보고 최적의 모델을 찾는 것은 굉장히 힘든 작업이기 때문에 이 작업을 자동적으로 해주는 함수를 사용해보도록 하겠습니다. 


1
2
3
4
5
6
7
8
9
10
11
from sklearn.linear_model import LogisticRegression
from sklearn import model_selection
 
model = LogisticRegression()
parameters = {
    'C': [2**02**32**62**92**12],
    'random_state': [071342]
}
gs = model_selection.GridSearchCV(model, parameters)
gs.fit(X, Y)
model = gs.best_estimator_
cs


  위의 코드에서 사용한 GridSearchCV() 함수는 설정한 파라미터들을 모델에 자동적으로 대입해주는 함수입니다. 그런 후 미리 설정한 데이터를 모델에 입력하여 best_estimator_ 함수로 최적의 모델을 찾아냅니다. Logistic Regression 내부에는 많은 파라미터들이 있지만 이번 글에서는 Iris DataSet의 개수가 많지 않기 때문에 적은 데이터셋에도 효과를 볼 수 있는 2개의 변수 만을 사용했습니다.


   최적의 모델을 구했기 때문에 다음으로는 데이터를 시각화하는 과정을 해보겠습니다. 시각화하는 코드는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from matplotlib import pyplot as plt
 
model.fit(X, Y)
= .02
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
 
= model.predict(np.c_[xx.ravel(), yy.ravel()])
= Z.reshape(xx.shape)
 
plt.figure(1, figsize=(43))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Set3)
plt.scatter(X[:, 0], X[:, 1], c=Y, edgecolors='k', cmap=plt.cm.Set3)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())
plt.show()
cs


  위의 코드에 대해서 설명을 하면 우선 데이터의 범위를 구한 뒤 데이터 범위 내의 모든 일정간격의 데이터들을 모두 최적화된 모델에 입력해서 결과값을 예측합니다. 예측한 결과값들에 먼저 색을 입혀 그림과 같이 배경을 3등분 해 줍니다. 그런 뒤 실제 데이터 값을 그래프에 표시해준 뒤 입력된 데이터들의 실제 분류값에 맞는 색을 입혀 그래프에 표시해 줍니다. 이렇게 되면 위의 그림과 같은 그래프가 완성됩니다.


  이전 글에서와 같이 Classifier의 Overfitting을 방지하기 위해 데이터셋을 train용과 test용으로 나누어 확인을 해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
model = LogisticRegression()
parameters = {
    'C': [2**02**32**62**92**12],
    'random_state': [071342]
}
gs = model_selection.GridSearchCV(model, parameters)
gs.fit(X_Data, Y_Data.values.ravel())
model = gs.best_estimator_
 
kfold = model_selection.KFold(n_splits=5, random_state=7, shuffle=True)
cv_results = model_selection.cross_val_score(model, X_Data, Y_Data.values.ravel(), cv=kfold, scoring="accuracy")
plt.boxplot(cv_results)
plt.show()
cs


  확인해본 결과 Iris DataSet의 데이터 개수가 적은 탓인지 Logistic Regression의 모든 파라미터를 Default 값으로 했을 때보다 성능이 좋아지지는 않았습니다. 하지만 위에서 사용한 최적의 모델을 찾는 것은 굉장히 중요하기 때문에 반드시 거쳐야 할 과정입니다.


  이것으로 Iris DataSet에 Logistic Regression을 사용해보는 것을 마치겠습니다.

반응형
Comments