Dive into hoge

データ分析関連の備忘録

Inputデータの次元が合わないとエラーが出たとき

まず前提のimportが下記。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

データセットこれ。ここからが本文。

df = pd.read_csv("Wholesale customers data.csv")
X = pd.DataFrame(df, columns=["Fresh", "Milk","Grocery","Frozen","Detergents_Paper","Delicassen"])
target = pd.DataFrame(df, columns=['Channel'])
X_train, X_test, y_train, y_test = train_test_split(X.values, target.values)

clf = SVC(kernel = 'linear')
clf.score(X_test, y_test)

これを実行すると下記のエラーが出る。

A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)

y を(n_samples, ) のshapeにしろと。いまはどうなっているかというと"y_train.ndim"実行すると"2"となる。2次元になっているので、次元を削除する必要がある。というわけで下記。

y_train=np.reshape(y_train,(-1))
y_test=np.reshape(y_test,(-1))

これで(n_samples, )の形式になる。ちなみに(-1)はもとの行数をいれてもいい。上記例なら、y_trainは330で、y_testは110でもいいけど、これは変わる可能性もあるし、いちいちカウントするのめんどくらいから全部というのを(-1)で指定。

逆に次元を増やしたいとき(こちらのほうをやる場面のほうが多いらしい)は下記。これでさっき1次元になったのが2次元に。(-1,1,1)とすればが3次元。

y_train=np.reshape(y_test,(-1,1))
y_test=np.reshape(y_test,(-1,1))