2017-11-22 4 views
0

문제가 데이터 세트를 분리하는 방식인지 또는 내가 잘못하고 있는지 알 수 없지만 프로그램을 실행할 때마다 정확도가 달라집니다. 아무도 내가 문제를 찾을 수 있도록 도와 줄 수 있습니까? 주셔서 감사합니다 여기 내 코드입니다 :코드를 수정하지 않고 다른 정확도 얻기

여기
import pandas as pd 
import matplotlib.pyplot as plt; plt.rcdefaults() 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.ensemble import AdaBoostClassifier, RandomForestClassifier,  ExtraTreesClassifier, GradientBoostingClassifier 
from sklearn.metrics import accuracy_score 
from sklearn.model_selection import train_test_split 
from sklearn.naive_bayes import GaussianNB 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn.neural_network import MLPClassifier 
from sklearn.svm import SVC 

# load the data 
from sklearn.tree import DecisionTreeClassifier 

# url = "data/lung-cancer.data" 
url = "http://archive.ics.uci.edu/ml/machine-learning-databases/lung-  cancer/lung-cancer.data" 
data_set = pd.read_csv(url) 

def clean_data(data_set): 
    # replace the ? with NaN 
    data_set = data_set.convert_objects(convert_numeric=True) 
    # replace the NaN with the average of the row 
    data_set = data_set.fillna(data_set.mean(axis=0), axis=0) 

    return data_set 

data_set = clean_data(data_set) 

def split_data(data_set): 
    # split the data in two parts train(80%), test(20%) 
    train, test = train_test_split(data_set.values, test_size=0.2) 

    # first column of the data are labels 
    labels_test = test[:, :1] 
    labels_train = train[:, :1] 

    # the rest of the columns are features 
    features_test = test[:, 1:] 
    features_train = train[:, 1:] 

    return features_train, labels_train, features_test, labels_test 

features_train, labels_train, features_test, labels_test = split_data(data_set) 
""" 
print(labels_train) 
print(features_train) 
print(features_test) 
print(labels_test) 
""" 

# Modeling step Test different algorithms 
random_state = 2 
classifiers = [ 
    GaussianNB(), 
    KNeighborsClassifier(n_neighbors=3), 
    KNeighborsClassifier(n_neighbors=5), 
    SVC(kernel="poly", C=0.4, probability=True), 
    DecisionTreeClassifier(random_state=3), 
    RandomForestClassifier(random_state=3), 
    AdaBoostClassifier(random_state=3), 
    ExtraTreesClassifier(random_state=3), 
    GradientBoostingClassifier(random_state=3), 
    MLPClassifier(random_state=random_state) 
] 

accuracy_res = [] 
algorithm_res = [] 
for clf in classifiers: 
    clf.fit(features_train, labels_train) 
    name = clf.__class__.__name__ 

    train_predictions = clf.predict(features_test) 

    accuracy = accuracy_score(labels_test, train_predictions) 
    print(name, "{:.4%}".format(accuracy)) 
    accuracy_res.append(accuracy) 
    algorithm_res.append(name) 
    print() 

y_pos = np.arange(len(algorithm_res)) 
plt.barh(y_pos, accuracy_res, align='center', alpha=0.5) 
plt.yticks(y_pos, algorithm_res) 
plt.xlabel('Accuracy') 
plt.title('Algorithms') 
plt.show() 

내가지고있어 결과입니다 : 첫 번째 결과

GaussianNB 28.5714% 
KNeighborsClassifier 57.1429% 
KNeighborsClassifier 71.4286% 
SVC 57.1429% 
DecisionTreeClassifier 57.1429% 
RandomForestClassifier 42.8571% 
AdaBoostClassifier 42.8571% 
ExtraTreesClassifier 42.8571% 
GradientBoostingClassifier 57.1429% 
MLPClassifier 57.1429% 

두 번째 결과

GaussianNB 28.5714% 
KNeighborsClassifier 42.8571% 
KNeighborsClassifier 28.5714% 
SVC 57.1429% 
DecisionTreeClassifier 28.5714% 
RandomForestClassifier 57.1429% 
AdaBoostClassifier 57.1429% 
ExtraTreesClassifier 42.8571% 
GradientBoostingClassifier 28.5714% 
MLPClassifier 57.1429% 

셋째 결과

GaussianNB 71.4286% 
KNeighborsClassifier 71.4286% 
KNeighborsClassifier 71.4286% 
SVC 28.5714% 
DecisionTreeClassifier 28.5714% 
RandomForestClassifier 57.1429% 
AdaBoostClassifier 71.4286% 
ExtraTreesClassifier 57.1429% 
GradientBoostingClassifier 28.5714% 
MLPClassifier 28.5714% 

답변

0
from sklearn.model_selection import train_test_split 

sklearn의 train_test_split을 사용했습니다. 데이터를 Train_set 및 Test_set으로 분할했습니다. 임의로입니다. 따라서 모델을 재 훈련 할 때마다 데이터는 다른 버전과 유사하지 않습니다.

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

+0

제발 어떻게 저를 바꾸라고 제안합니까? 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? –

+0

데이터를 먼저 나눌 수있는 함수를 작성하십시오 –

+0

고맙습니다. –

1

당신이 train_test_split을 사용하고 있기 때문에, 그것은 정도의 차이 당신이 위의 코드를 실행할 때마다 원인이 무작위로 데이터를 분할합니다.

출력을 여러 번보고 여러 출력에서 ​​정확도의 평균을 찾는 것이 좋습니다. 출력을 리다이렉션하여 파이썬이 처리하도록 할 수 있습니다. 모델의 평균 정확도가 가장 높습니다.

코드를 실행할 때 n_neighbors = 5 인 KNeighborsClassifier를 사용할 때 가장 정확함을 얻었습니다. 또한 경고가 없도록 몇 가지 수정을했습니다. 다음과 같이 업데이트 된 코드를 찾으십시오. 거기에 참조를 위해 수정 사항이있는 곳에서 주석을 업데이트했습니다.

import pandas as pd 
import matplotlib.pyplot as plt; plt.rcdefaults() 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.ensemble import AdaBoostClassifier, RandomForestClassifier,  ExtraTreesClassifier, GradientBoostingClassifier 
from sklearn.metrics import accuracy_score 
from sklearn.model_selection import train_test_split 
from sklearn.naive_bayes import GaussianNB 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn.neural_network import MLPClassifier 
from sklearn.svm import SVC 

# load the data 
from sklearn.tree import DecisionTreeClassifier 

# url = "data/lung-cancer.data" 
url = "http://archive.ics.uci.edu/ml/machine-learning-databases/lung-cancer/lung-cancer.data" 
data_set = pd.read_csv(url) 

def clean_data(data_set): 
    # replace the ? with NaN 
    # data_set = data_set.convert_objects(convert_numeric=True) 
    # convert objects is deprecated 
    data_set = data_set.apply(pd.to_numeric, errors='coerce') 
    # replace the NaN with the average of the row 
    data_set = data_set.fillna(data_set.mean(axis=0), axis=0) 

    return data_set 

data_set = clean_data(data_set) 

def split_data(data_set): 
    # split the data in two parts train(80%), test(20%) 
    train, test = train_test_split(data_set.values, test_size=0.2) 

    # first column of the data are labels 
    labels_test = test[:, :1] 
    labels_train = train[:, :1] 

    # the rest of the columns are features 
    features_test = test[:, 1:] 
    features_train = train[:, 1:] 

    return features_train, labels_train, features_test, labels_test 

features_train, labels_train, features_test, labels_test = split_data(data_set) 
""" 
print(labels_train) 
print(features_train) 
print(features_test) 
print(labels_test) 
""" 

# Modeling step Test different algorithms 
random_state = 2 
classifiers = [ 
    GaussianNB(), 
    KNeighborsClassifier(n_neighbors=3), 
    KNeighborsClassifier(n_neighbors=5), 
    SVC(kernel="poly", C=0.4, probability=True), 
    DecisionTreeClassifier(random_state=3), 
    RandomForestClassifier(random_state=3), 
    AdaBoostClassifier(random_state=3), 
    ExtraTreesClassifier(random_state=3), 
    GradientBoostingClassifier(random_state=3), 
    # MLPClassifier(random_state=random_state) 
    # Set hidden_layer_sizes and max_iter parameters 
    # so that multilayer perceptron will converge 
    MLPClassifier(solver='lbfgs', hidden_layer_sizes=[100], max_iter=2000, activation='logistic', random_state=random_state) 
] 

accuracy_res = [] 
algorithm_res = [] 
for clf in classifiers: 
    # clf.fit(features_train, labels_train) 
    # Added ravel to convert column vector to 1d array 
    clf.fit(features_train, labels_train.ravel()) 
    name = clf.__class__.__name__ 

    train_predictions = clf.predict(features_test) 

    accuracy = accuracy_score(labels_test, train_predictions) 
    print(name, "{:.4%}".format(accuracy)) 
    accuracy_res.append(accuracy) 
    algorithm_res.append(name) 
    print() 

y_pos = np.arange(len(algorithm_res)) 
plt.barh(y_pos, accuracy_res, align='center', alpha=0.5) 
plt.yticks(y_pos, algorithm_res) 
plt.xlabel('Accuracy') 
plt.title('Algorithms') 
plt.show() 
+0

제안 된 바와 같이 정확도의 평균은 좋은 메트릭이거나 k- 교차 교차 유효성 검사라고합니다. 그것에 더 많은 것 [여기에서] (http://scikit-learn.org/stable/modules/cross_validation.html). – skrubber

+0

문서 링크를 제공해 주셔서 감사합니다. 또한 그는 bagging/boosting과 같은 앙상블 방법을 사용하여 부트 스트랩을 사용하여 무작위 샘플링을 대체하여보다 정확한 결과를 얻을 수 있다고 생각합니다. 회귀 분석에 대한 분류 및 평균을위한 투표를 제공합니다. –

+0

누군가가 게시물을 downvoted. 이유를 설명해 주시면 고칠 수 있습니다. 감사! –