사이킷런의 데이터셋 모델에서
위스콘신 유방암 데이터셋을 제공하고 있습니다.
voting classifier를 사용할 건데
여기서 로지스틱 회귀 모델, K최근접 이웃 이 두 가지를 사용하겠습니다.
일단 필요한 라이브러리들 부터 임포트 해줍시다.
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.ensemble import VotingClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
load_breast_cancer()로 유방암 관련 데이터를 읽어줍시다.
sklearn.dataset에서 load 혹은 fetch 함수로 가져온 데이터들은
sklearn.utils.Bunch 타입으로
이 데이터는 기본적으로
데이터셋에 대한 설명인 DESCR, 타겟변수명 target_names, 피처명 feature_names, data, target 등 변수들을
가지고 있습니다.
description을 읽어보면
데이터수는 569개
속성은 30개 정도 된다고 합니다.
타겟은 악성, 양성 종양 2개
cancer = load_breast_cancer()
print(type(cancer))
bunch 클래스 내용을 참고해서 바로 데이터프레임으로 만들어줍시다.
df = pd.DataFrame(data=cancer.data, columns=cancer.feature_names)
df["class"] = cancer.target
df.head()
데이터들을 분리해주고
모델들을 만들어줍시다.
voting_classifier(분류기 리스트, voting="보팅기법")으로 선언해주어야 합니다.
X_train, X_test, y_train, y_test = train_test_split(df.iloc[:,:-1], df.iloc[:,-1],test_size=0.2)
lr = LogisticRegression()
knn = KNeighborsClassifier()
vo = VotingClassifier([("lr", lr), ("knn", knn)], voting="soft")
vo.fit(X_train, y_train)
y_pred = vo.predict(X_test)
print("acc : {}".format(accuracy_score(y_test, y_pred)))
for clf in [lr, knn]:
clf_name = clf.__class__.__name__
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print("{}'s acc : {}'".format(clf_name,acc))
분류기 정확도는 0.956140350877193
두 뷴류기의 성능을 보면
로지스틱 회귀가 0.9385964912280702
K최근접이웃은 0.9473684210526315으로 k 최근접 이웃이 조금 더 좋은 성능을 보이고 있습니다.
로지스틱 회귀의 경우 전처리로
데이터셋을 표준 정규분포로 정규화 시키면 더 좋은 성능을 보인다고 합니다.
preprocessing 모듈의 StandardScaler를 사용해봅시다.
보팅 분류기가 0.9561403에서 0.973684로
로지스틱 회귀가 0.93859에서 0.964912
K최근접이웃이 0.947368에서 0.973684로 조금더 성능이 개선되었습니다.
from sklearn.preprocessing import StandardScaler
scaler1 = StandardScaler()
scaler2 = StandardScaler()
X_train = scaler1.fit_transform(X_train)
X_test = scaler2.fit_transform(X_test)
lr = LogisticRegression()
knn = KNeighborsClassifier()
vo = VotingClassifier([("lr", lr), ("knn", knn)], voting="soft")
vo.fit(X_train, y_train)
y_pred = vo.predict(X_test)
print("acc : {}".format(accuracy_score(y_test, y_pred)))
for clf in [lr, knn]:
clf_name = clf.__class__.__name__
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print("{}'s acc : {}'".format(clf_name,acc))
전처리 후 성능이 개선된건 좋지만
매번 할때마다 성능이 조금씩 변하고 있습니다.
cross_val_score() 함수로 교차검증 까지 해봅시다.
교차 검증 결과 확실히 성능이 개선됨을 알수 있었습니다.
VotingClassifier : 0.9753443632166217
LogisticRegression : 0.9806848787995384
KNeighborsClassifier : 0.9595075028857252
from sklearn.model_selection import cross_val_score
for clf in [vo, lr, knn]:
scores = cross_val_score(clf, np.concatenate((X_train,X_test)),
np.concatenate((y_train, y_test)),
scoring="accuracy", cv=5)
print(clf.__class__.__name__)
print(scores)
print(np.mean(scores))
print()
'인공지능' 카테고리의 다른 글
파이썬머신러닝 - 13. GBM로 사용자 행동 분류 (0) | 2020.11.26 |
---|---|
파이썬머신러닝 - 12. 랜덤 포레스트로 사용자 행동 분류하기 (0) | 2020.11.26 |
파이썬머신러닝 - 10. 앙상블 모델 개요 (0) | 2020.11.26 |
파이썬머신러닝 - 9. 결정 트리를 이용한 사용자 행동 인식 분류하기 (0) | 2020.11.25 |
파이썬머신러닝 - 8. 결정 트리 (0) | 2020.11.25 |