2017-11-13 3 views
-1

sklearn을 사용하여 K-fold로 의사 결정 트리를 적용하고 누군가가 평균 점수를 표시하도록 도울 수 있습니다.Sklearn을 사용한 K-Fold 교차 유효성 검사 방법

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.model_selection import KFold 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.metrics import confusion_matrix,classification_report 

dta=pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/blood-transfusion/transfusion.data") 

X=dta.drop("whether he/she donated blood in March 2007",axis=1) 

X=X.values # convert dataframe to numpy array 

y=dta["whether he/she donated blood in March 2007"] 

y=y.values # convert dataframe to numpy array 

kf = KFold(n_splits=10) 

KFold(n_splits=10, random_state=None, shuffle=False) 

clf_tree=DecisionTreeClassifier() 

for train_index, test_index in kf.split(X): 
    X_train, X_test = X[train_index], X[test_index] 
    y_train, y_test = y[train_index], y[test_index] 
    clf=clf_tree.fit(X_train,y_train) 
    print("classification_report_tree", 
      classification_report(y_test,clf_tree.predict(X_test))) 
+0

코드를 잘 이해할 수 있도록 코드에 설명을 추가 할 수 있습니까 – Saineshwar

+0

평균 점수 란 무엇입니까? 정확성 만 원하니? 또는 리콜, 정밀도 및 f1 (분류 보고서를 인쇄 할 때). –

+0

K fold로 의사 결정 트리를 실행하고 전체적인 정확도를 보여주고 싶습니다. k 배는 10이며 10 회 실행하고 각 실행 시간마다 10 정확도를 부여합니다. 훈련의 전반적인 정확도를 나타내는 방법 –

답변

0

당신은 sklearn에서 메트릭 Precision_reacll_fscore_support을 시도하고 클래스 당 각 배의 결과를 평균 얻을 수 있습니다 : 다음은 내 코드입니다. 여기 수업 당 평균 점수가 필요하다고 가정합니다.

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.model_selection import KFold 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.metrics import precision_recall_fscore_support 
from sklearn.model_selection import GridSearchCV,cross_val_score 

dta=pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/blood-transfusion/transfusion.data") 

X=dta.drop("whether he/she donated blood in March 2007",axis=1) 

X=X.values # convert dataframe to numpy array 

y=dta["whether he/she donated blood in March 2007"] 

y=y.values # convert dataframe to numpy array 

kf = KFold(n_splits=10) 

KFold(n_splits=10, random_state=None, shuffle=False) 

clf_tree=DecisionTreeClassifier() 

score_array =[] 
for train_index, test_index in kf.split(X): 
    X_train, X_test = X[train_index], X[test_index] 
    y_train, y_test = y[train_index], y[test_index] 
    clf=clf_tree.fit(X_train,y_train) 
    y_pred = clf.predict(X_test) 
    score_array.append(precision_recall_fscore_support(y_test, y_pred, average=None)) 

avg_score = np.mean(score_array,axis=0) 
print(avg_score) 

#Output: 
#[[ 0.77302466 0.30042282] 
# [ 0.81755068 0.22192344] 
# [ 0.79063779 0.24414489] 
# [ 57.   17.8  ]] 

이제 클래스 0의 정밀도를 얻으려면 avg_score[0][0]을 사용할 수 있습니다. 리콜은 두 번째 행 (즉, 클래스 0의 경우 avg_score[1][0])으로 액세스 할 수 있지만 fscore 및 지원은 각각 3 행 및 4 행에서 액세스 할 수 있습니다. 만 정확성을 원하는 경우

1

, 당신은 단순히 cross_val_score()

kf = KFold(n_splits=10) 
clf_tree=DecisionTreeClassifier() 
scores = cross_val_score(clf_tree, X, y, cv=kf) 

avg_score = np.mean(score_array) 
print(avg_score) 

여기 cross_val_score이 (기차 및 테스트에 분할없이) 입력으로 원래의 X와 Y를 취할 것입니다 사용할 수 있습니다. cross_val_score은 열차와 시험으로 자동 분리하고 열차 데이터에 모델을 적용하고 테스트 데이터로 점수를 매기는 것입니다. 그 점수는 scores 변수로 반환됩니다.

그래서 10 배가되면 scores 변수에 10 개의 점수가 반환됩니다. 그런 다음 평균을 취할 수 있습니다.

+0

도움 주셔서 감사합니다. 나는 당신의 코드를 성공적으로 적용했다. –

+0

@ NgọcVũĐình 문제가 해결되면 [대답 접수] (https://stackoverflow.com/help/someone-answers)를 고려하십시오. –