2017-10-19 5 views
1

私はPythonでkNN(k-nearest neighbor)アルゴリズムを実行しようとしています。列テストの分割はPythonでは正しく動作していないようですか?

私がしようとすると、これはUCI機械学習リポジトリで利用できる行うために使用していたデータセット:ここ

https://archive.ics.uci.edu/ml/datasets/wineは、私が使用していたコードです:

セクション5では
#1. LIBRARIES 
import os 
import pandas as pd 
import numpy as np 
print os.getcwd() # Prints the working directory 
os.chdir('C:\\file_path') # Provide the path here 

#2. VARIABLES 
variables = pd.read_csv('wines.csv') 
winery = variables['winery'] 
alcohol = variables['alcohol'] 
malic = variables['malic'] 
ash = variables['ash'] 
ash_alcalinity = variables['ash_alcalinity'] 
magnesium = variables['magnesium'] 
phenols = variables['phenols'] 
flavanoids = variables['flavanoids'] 
nonflavanoids = variables['nonflavanoids'] 
proanthocyanins = variables['proanthocyanins'] 
color_intensity = variables['color_intensity'] 
hue = variables['hue'] 
od280 = variables['od280'] 
proline = variables['proline'] 

#3. MAX-MIN NORMALIZATION 
alcoholscaled=(alcohol-min(alcohol))/(max(alcohol)-min(alcohol)) 
malicscaled=(malic-min(malic))/(max(malic)-min(malic)) 
ashscaled=(ash-min(ash))/(max(ash)-min(ash)) 
ash_alcalinity_scaled=(ash_alcalinity-min(ash_alcalinity))/(max(ash_alcalinity)-min(ash_alcalinity)) 
magnesiumscaled=(magnesium-min(magnesium))/(max(magnesium)-min(magnesium)) 
phenolsscaled=(phenols-min(phenols))/(max(phenols)-min(phenols)) 
flavanoidsscaled=(flavanoids-min(flavanoids))/(max(flavanoids)-min(flavanoids)) 
nonflavanoidsscaled=(nonflavanoids-min(nonflavanoids))/(max(nonflavanoids)-min(nonflavanoids)) 
proanthocyaninsscaled=(proanthocyanins-min(proanthocyanins))/(max(proanthocyanins)-min(proanthocyanins)) 
color_intensity_scaled=(color_intensity-min(color_intensity))/(max(color_intensity)-min(color_intensity)) 
huescaled=(hue-min(hue))/(max(hue)-min(hue)) 
od280scaled=(od280-min(od280))/(max(od280)-min(od280)) 
prolinescaled=(proline-min(proline))/(max(proline)-min(proline)) 
alcoholscaled.mean() 
alcoholscaled.median() 
alcoholscaled.min() 
alcoholscaled.max() 

#4. DATA FRAME 
d = {'alcoholscaled' : pd.Series([alcoholscaled]), 
'malicscaled' : pd.Series([malicscaled]), 
'ashscaled' : pd.Series([ashscaled]), 
'ash_alcalinity_scaled' : pd.Series([ash_alcalinity_scaled]), 
'magnesiumscaled' : pd.Series([magnesiumscaled]), 
'phenolsscaled' : pd.Series([phenolsscaled]), 
'flavanoidsscaled' : pd.Series([flavanoidsscaled]), 
'nonflavanoidsscaled' : pd.Series([nonflavanoidsscaled]), 
'proanthocyaninsscaled' : pd.Series([proanthocyaninsscaled]), 
'color_intensity_scaled' : pd.Series([color_intensity_scaled]), 
'hue_scaled' : pd.Series([huescaled]), 
'od280scaled' : pd.Series([od280scaled]), 
'prolinescaled' : pd.Series([prolinescaled])} 
df = pd.DataFrame(d) 

#5. TRAIN-TEST SPLIT 
from sklearn.model_selection import train_test_split 
X_train, X_test, y_train, y_test = train_test_split(np.matrix(df),np.matrix(winery),test_size=0.3) 
print X_train.shape, y_train.shape 
print X_test.shape, y_test.shape 

#6. K-NEAREST NEIGHBOUR ALGORITHM 
from sklearn.neighbors import KNeighborsClassifier 
knn = KNeighborsClassifier(n_neighbors=10) 
knn.fit(X_train, y_train) 
print("Test set score: {:.2f}".format(knn.score(X_test, y_test))) 

、私は実行列車テストの分割メカニズムをインポートするにはsklearn.model_selectionを使用しますが、形状が提供されているため正しく実行されていません。(0,13) (0,178) (1,13) (1,178)

次に、knnを実行しようとすると、エラーメッセージが表示されます。Found array with 0 sample(s) (shape=(0,13)) while a minimum of 1 is required.これは、変数がスケーリングされていない場合でもこのエラーメッセージが表示されるため、max-min正規化によるスケーリングによるものではありません。

答えて

2

あなたのコードがどこに間違っているのか正確には分かりませんが、sklearnのドキュメントと比べると少し違っています。しかし、私はあなたにワインのデータセットで作業するために列車テストの分割を取得する別の方法を示すことができます。

from sklearn.datasets import load_wine 
from sklearn.preprocessing import MinMaxScaler 
from sklearn.model_selection import train_test_split 
from sklearn.neighbors import KNeighborsClassifier 

X, y = load_wine(return_X_y=True) 
X_scaled = MinMaxScaler().fit_transform(X) 
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, 
                test_size=0.3) 
knn = KNeighborsClassifier(n_neighbors=10) 
knn.fit(X_train, y_train) 
+0

たぶん 'test_train_splitは()' 'numpy.ndarray'ない' numpy.matrixlib.defmatrix.matrix' – cardamom

+1

感謝を望んでいます。ワインのデータセットをインポートしようとすると、「名前を読み込めません」というエラーが表示されます。私はload_irisでこれをやろうとしましたが、knn.fitを実行しても問題はありませんでした。その特定のデータセットにエラーがあると思っています。手動でインポートしようとすると、別のファイルタイプになります。 – empoleon

+0

@cardamom:最初にデータフレームを生成したときの形式は、pandas.core.frame.DataFrameでした。問題がこの原因かどうかはわかりません。 – empoleon

関連する問題