2017-11-22 15 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% 

2番目の結果

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を使用しているので、それは精度の違いにあなたが上記のコードを実行するたびに発生するランダムデータを分割します。

出力を複数回見て、複数の出力から精度の平均を見つけることをお勧めします。あなたは出力をリダイレクトして、pythonがそれをあなたに任せることができます。モデルの平均精度が最高になります。

私はあなたのコードを実行したとき、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。私はそれを訂正できるように理由をコメントに残してください。ありがとう! –

関連する問題