web-dev-qa-db-ja.com

SciKit線形回帰で「ValueError:形状が整列されていません」を取得する

SciKitと線形代数/機械学習は一般的にPythonであるため、次のことを解決できないようです。

連続値と離散/カテゴリ値の両方を含むデータのトレーニングセットとテストセットがあります。 CSVファイルはPandas DataFramesに読み込まれ、形状が一致し、(1460,81)と(1459,81)になります。ただし、 Pandasのget_dummies 、 DataFrameの形状が(1460、306)と(1459、294)に変わります。したがって、 SciKit Linear Regression モジュールを使用して線形回帰を実行すると、306変数のモデルが作成され、試行されます。 294しかないものを予測すると、当然、次のエラーが発生します。

ValueError: shapes (1459,294) and (306,1) not aligned: 294 (dim 1) != 306 (dim 0)

どうすればそのような問題に取り組むことができますか?どういうわけか(1459、294)を他のものと一致するように形を変えることができますか?

おかげで、私は自分自身を明確にしたことを願っています:)

9
Koen

これは、カテゴリデータを処理するときに非常に一般的な問題です。これを最適に処理する方法については、さまざまな意見があります。

考えられるアプローチの1つは、可能なオプションのセットを制限する関数をカテゴリカル機能に適用することです。たとえば、機能にアルファベットの文字が含まれている場合、A、B、C、D、および「その他/不明」の機能をエンコードできます。このようにして、テスト時に同じ機能を適用し、問題から抽象化することができます。もちろん、明らかな欠点は、機能スペースを減らすことにより、意味のある情報が失われる可能性があることです。

もう1つのアプローチは、トレーニングデータに基づいてモデルを構築し、ダミーが自然に作成されたものを使用して、それをモデルのベースラインとして扱うことです。テスト時にモデルを使用して予測する場合、トレーニングデータが変換されるのと同じ方法でテストデータを変換します。たとえば、トレーニングセットの機能にアルファベットの文字が含まれていて、テストセットの同じ機能に「AA」の値が含まれている場合、予測を行う際にそれを無視します。これはあなたの現在の状況の逆ですが、前提は同じです。不足している機能をその場で作成する必要があります。もちろん、このアプローチには欠点もあります。

2番目のアプローチは、質問で言及したものなので、pandasを使用して説明します。

get_dummiesを使用すると、カテゴリカル機能が複数のワンホットエンコード機能にエンコードされます。次のように、reindexを使用して、テストデータをトレーニングデータと一致させることができます。

test_encoded = pd.get_dummies(test_data, columns=['your columns'])
test_encoded_for_model = test_encoded.reindex(columns = training_encoded.columns, 
    fill_value=0)

これにより、トレーニングデータと同じ方法でテストデータがエンコードされ、テストデータのエンコードでは作成されなかったが、トレーニングプロセス中に作成されたダミーフィーチャに0が入力されます。

これを関数にラップして、その場でテストデータに適用することができます。列名の配列またはリストを作成する場合、メモリ内のエンコードされたトレーニングデータ(training_encoded.columnsでアクセスします)は必要ありません。

7
Nick Becker

興味のある人のために:私は列車とテストセットをマージし、次にダミーを生成し、そしてデータをまったく同じ割合で再び分割することになりました。そうすれば、まったく同じダミーデータが生成されるため、形状が異なっても問題は発生しなくなりました。

1
Koen

これは私のために働きます:
最初は、次のエラーメッセージが表示されていました。

_shapes (15754,3) and (4, ) not aligned 
_

列車データの変数を使用してモデルを作成していることがわかりました。しかし、定数X_train = sm.add_constant(X_train)を追加すると、定数変数が自動的に作成されます。したがって、合計で4変数があります。
そして、このモデルをデフォルトでテストする場合、テスト変数には変数があります。そのため、ディメンションの不一致に対してエラーがポップアップ表示されます。
そこで、y_testのダミー変数も作成するトリックを使用しました。

_`X_test = sm.add_constant(X_test)`
_

これは役に立たない変数ですが、これですべての問題が解決します。

0