본문 바로가기
머신러닝

[머신러닝] sklearn.datasets, hyper parameter, GridSearchCV

by eyoo 2022. 5. 9.

scikit learn 에서 많이 사용하는 데이터셋을 기본적으로 제공한다.

 

sklearn.datasets을 사용하여 유방암의 양성과 악성을 진단할수있는 데이터셋을 가져오자.

 

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()

# cancer 변수로 딕셔너리 형태의 데이터셋을 저장했다.

 

 

어떤 데이터들이 들어있는지 확인해보자.

 

in:

cancer.keys()

out:

dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])

# 7개의 키가 있다.

# feature_names에 종양의 특징들을 나타낸 열의 이름이 나열되어 있고, data에 그 열의 데이터가 들어있다.

# target에 데이터에 따른 결과가 0과 1로 구분되어있으며, target_names에는 0이 악성 종양, 1이 양성 종양인것을 밝히고 있다.

 

 

넘파이 형식의 행렬들을 판다스로 변환하기 전, np.c_를 사용하여 데이터들을 합쳐보자

 

my_data = np.c_[cancer['data'], cancer['target']]

# 데이터와 결과값인 타겟을 합쳐 데이터를 활용할수 있는 형태로 변환시켰다.

# np.c_는 넘파이끼리 행의 갯수가 같으면 옆에 컬럼으로 바로 붙이는 함수다.

 

 

컬럼명들도 np.append 함수를 사용하여 합쳐주자.

 

my_columns = np.append(cancer['feature_names'],'target')

 

 

이제 pd.DataFrame함수에 데이터와 컬럼을 넣어 판다스의 데이터프레임을 만들자.

 

df = pd.DataFrame(data= my_data, columns = my_columns)

 

 

pairplot을 이용해서 각 컬럼의 관계를 파악해보자

 

in:

sb.pairplot(data=df, vars=['mean radius', 'mean texture', 'mean perimeter', 'mean area', 'mean smoothness'], hue = 'target')
plt.show()

out:

# seaborn의 특정 값의 색상을 넣어주는 hue 파라미터에 target 값을 넣어 각 데이터들에서 악성종양과의 관계를 알수있다.

 

 

히트맵을 통해 전체 컬럼의 상관계수를 구하자

 

in:

corr_result = df.corr()
plt.figure(figsize=(25,15))
sb.heatmap(data= corr_result, annot= True,fmt='.1f', vmin = -1, vmax= 1, cmap = 'coolwarm', linewidths= 0.5)
plt.show()

out:

# vmax와 vmin으로 최대값과 최소값을 각각 1과 -1로 설정했다.

# cmap에 coolwarm으로 설정하여 0을 기준으로 붉은색과 푸른색으로 쉽게 볼수있도록 설정했다.

# 0이 악성 1이 양성이므로 파란색이 진할수록 악성종양과의 관계가 크다.

 

 

이 데이터셋으로 SVC방식으로 인공지능을 학습시키자.

 

X = df.iloc[: , :-1]
y = df['target']

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X = scaler.fit_transform(X)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.25,random_state=3)

from sklearn.svm import SVC
classifier = SVC(kernel= 'linear', random_state= 3)
classifier.fit(X_train,y_train)

 

 

성능평가

 

in:

y_pred = classifier.predict(X_test)
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)

out:

0.9790209790209791

 

 

위에서 인공지능을 SVC로 설정해줄때 파라미터를 넣는데 이때 kernel 과 같은 사람이 설정해줘야 되는 값을 하이퍼 파라미터라고 한다.

 

하이퍼 파라미터는 어떤 값을 설정해야 높은 정확도를 구할수있는지 모르지만 GridSearchCV를 통해 유추할수 있다.

 

SVC의 하이퍼 파라미터값인 C, kernel, gamma값들을 무작위로 정해 딕셔너리로 만들어 변수로 저장한다.

 

para_grid = {'C':[0.1,1,10,100],'kernel':['linear','rbf','poly'],'gamma':[1,0.1,0.01]}

 

 

GridSearchCV를 실행시킨다.

 

in:

from sklearn.model_selection import GridSearchCV
grid = GridSearchCV( SVC() , para_grid, refit= True, verbose =4  )
grid.fit(X_train, y_train)

out:

Fitting 5 folds for each of 36 candidates, totalling 180 fits
[CV 1/5] END .....C=0.1, gamma=1, kernel=linear;, score=0.965 total time=   0.0s
[CV 2/5] END .....C=0.1, gamma=1, kernel=linear;, score=0.965 total time=   0.0s
[CV 3/5] END .....C=0.1, gamma=1, kernel=linear;, score=0.929 total time=   0.0s
[CV 4/5] END .....C=0.1, gamma=1, kernel=linear;, score=0.929 total time=   0.0s
[CV 5/5] END .....C=0.1, gamma=1, kernel=linear;, score=0.953 total time=   0.0s
[CV 1/5] END ........C=0.1, gamma=1, kernel=rbf;, score=0.977 total time=   0.0s
[CV 2/5] END ........C=0.1, gamma=1, kernel=rbf;, score=0.953 total time=   0.0s
[CV 3/5] END ........C=0.1, gamma=1, kernel=rbf;, score=0.929 total time=   0.0s
...

# 첫번째 파라미터에 인공지능 함수를 입력한다.

# 두번째 파라미터에는 앞서 설정했던 하이퍼 파라미터의 딕셔너리 형태의 변수를 입력했다.

# refit은 재학습 여부를 설정한다.

# verbose는 화면에 결과를 볼수있게 출력한다는 뜻이다.

 

 

이제 best_estimator_를 사용하여 가장 좋은 조합의 인공지능을 가져올수 있다.

 

in:

best_classifier = grid.best_estimator_
y_pred = best_classifier.predict(X_test)
accuracy_score(y_test,y_pred)

out:

0.9790209790209791

# 정확도가 97.9%다.

 

 

grid.best_params_로 가장 좋은 모델에 사용된 하이퍼 파라미터를 확인할수 있다.

 

in:

grid.best_params_

out:

{'C': 0.1, 'gamma': 1, 'kernel': 'poly'}

 

 

또한 grid.best_score_로 GridSearchCV함수를 통해 계산한 결과를 불러올수 있다.

 

in:

grid.best_score_

out:

0.9788235294117648

# 이 정확도는 best_estimator_를 사용하여 만든 인공지능의 정확도와 다르다.

# 그 이유로는 서로 다른 데이터셋을 이용했기 때문이다. 

# (best_estimator_ : train 데이터,    grid.best_score_ : test 데이터)

 

 

 

 

 

댓글