web-dev-qa-db-ja.com

RandomForestClassfier.fit():ValueError:文字列をfloatに変換できませんでした

単純な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です。

45
nilkn

Fitを使用する前に、何らかのエンコードを行う必要があります。 fit()は文字列を受け入れないと言われましたが、これを解決します。

使用できるクラスはいくつかあります。

  • LabelEncoder :文字列を増分値に変換します
  • OneHotEncoder :One-of-Kアルゴリズムを使用して文字列を整数に変換します

個人的には、少し前にStackOverflowに 同じ質問 を投稿しています。スケーラブルなソリューションを望んでいましたが、答えが得られませんでした。すべての文字列を二値化するOneHotEncoderを選択しました。これは非常に効果的ですが、文字列が大きく異なる場合、マトリックスは非常に急速に成長し、メモリが必要になります。

48
RPresle

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])
10
SinOfWrath

strをモデルfit()メソッドに渡すことはできません。前述のとおり here

トレーニング入力サンプル。内部的には、dtype = np.float32に変換され、スパース行列がスパースcsc_matrixに提供される場合。

データをフロートに変換して、 LabelEncoder を試してください。

8
farhawa

同様の問題があり、 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
6
pittsburgh137

この種の分類子に合わせて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およびLabelEncoderinpreprocessingモジュールで使用できます。ただし、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
4
jo nova