単純なCSVファイルがあります:
A,B,C
Hello,Hi,0
Hola,Bueno,1
明らかに、実際のデータセットはこれよりはるかに複雑ですが、これはエラーを再現します。次のように、ランダムなフォレスト分類子を作成しようとしています。
cols = ['A','B','C']
col_types = {'A': str, 'B': str, 'C': int}
test = pd.read_csv('test.csv', dtype=col_types)
train_y = test['C'] == 1
train_x = test[cols]
clf_rf = RandomForestClassifier(n_estimators=50)
clf_rf.fit(train_x, train_y)
しかし、fit()を呼び出すと、このトレースバックが表示されます。
ValueError: could not convert string to float: 'Bueno'
scikit-learnバージョンは0.16.1です。
Fitを使用する前に、何らかのエンコードを行う必要があります。 fit()は文字列を受け入れないと言われましたが、これを解決します。
使用できるクラスはいくつかあります。
個人的には、少し前にStackOverflowに 同じ質問 を投稿しています。スケーラブルなソリューションを望んでいましたが、答えが得られませんでした。すべての文字列を二値化するOneHotEncoderを選択しました。これは非常に効果的ですが、文字列が大きく異なる場合、マトリックスは非常に急速に成長し、メモリが必要になります。
LabelEncodingは私のために働いた(基本的にあなたは機能的にデータをエンコードする必要があります)(mydataは文字列データ型の2次元配列です):
myData=np.genfromtxt(filecsv, delimiter=",", dtype ="|a20" ,skip_header=1);
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
for i in range(*NUMBER OF FEATURES*):
myData[:,i] = le.fit_transform(myData[:,i])
str
をモデルfit()
メソッドに渡すことはできません。前述のとおり here
トレーニング入力サンプル。内部的には、dtype = np.float32に変換され、スパース行列がスパースcsc_matrixに提供される場合。
データをフロートに変換して、 LabelEncoder を試してください。
同様の問題があり、 pandas.get_dummies() が問題を解決したことがわかりました。具体的には、カテゴリデータの列をブール列のセットに分割し、各入力列の一意の値ごとに1つの新しい列を作成します。あなたの場合、train_x = test[cols]
を次のように置き換えます:
train_x = pandas.get_dummies(test[cols])
これにより、train_x DataframeがRandomForestClassifierが受け入れ可能な次の形式に変換されます。
C A_Hello A_Hola B_Bueno B_Hi
0 0 1 0 0 1
1 1 0 1 1 0
この種の分類子に合わせてstr
を渡すことはできません。
たとえば、3つの異なるグレードを持つ「grade」という名前の機能列がある場合:
A、BおよびC.
これらのstr
"A"、 "B"、 "C"をエンコーダーによってマトリックスに転送する必要があります次のように:
A = [1,0,0]
B = [0,1,0]
C = [0,0,1]
str
には分類子の数値的な意味がないためです。
Scikit-learnでは、OneHotEncoder
およびLabelEncoder
はinpreprocessing
モジュールで使用できます。ただし、OneHotEncoder
は文字列のfit_transform()
をサポートしていません。変換中に「ValueError:文字列を浮動小数点に変換できませんでした」が発生する場合があります。
LabelEncoder
を使用して、str
から連続した数値に転送できます。その後、OneHotEncoder
で希望どおりに転送できます。
Pandasデータフレームでは、dtype:object
に分類されるすべてのデータをエンコードする必要があります。次のコードは私のために機能し、これがあなたの助けになることを願っています。
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
for column_name in train_data.columns:
if train_data[column_name].dtype == object:
train_data[column_name] = le.fit_transform(train_data[column_name])
else:
pass