3

かなりSciKitと一般的にはPythonで学ぶ線形代数/マシンに新しいので、私は、次の解決に見えることはできません。 行き方:SciKit線形回帰に「とValueErrorが揃っていない形状」

私はトレーニングセットを持っています連続値と離散値/カテゴリ値の両方を含むテスト・データ・セット。 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)を他のものに合わせて形を変えることができますか?

おかげで、私は自分自身を明らかにしました:)カテゴリーデータを扱う際に

答えて

4

は、これは非常に共通の問題であると思います。これを最もうまく処理する方法については、さまざまな意見があります。

考えられる方法の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でアクセスします)をメモリに保存する必要はありません。

1

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

0

は、これが私の作品:
当初、私はこのエラーメッセージになった:

shapes (15754,3) and (4,) not aligned 

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

`X_test = sm.add_constant(X_test)` 

これは無駄な変数ですが、これによってすべての問題が解決されます。

関連する問題