728x90

사이킷런의 데이터셋 모델에서

 

위스콘신 유방암 데이터셋을 제공하고 있습니다.

 

 

 

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()

 

300x250

+ Recent posts