0

私は、それぞれ100個の予測値を使って元のデータに1-3度の多項式変換を適合させることを実験しています。まず、元のデータを再構成し、2)テストセットと予測空間(データフィーチャ)にfit_transformを適用し、3)予測空間で線形予測を行い、4)次のコードを使用して配列にエクスポートした。Python sklearn多項式の前処理と次元の問題

from sklearn.linear_model import LinearRegression 
 
from sklearn.preprocessing import PolynomialFeatures 
 
from sklearn.model_selection import train_test_split 
 
np.random.seed(0) 
 
n = 100 
 
x = np.linspace(0,10,n) + np.random.randn(n)/5 
 
y = np.sin(x)+n/6 + np.random.randn(n)/10 
 
x = x.reshape(-1, 1) 
 
y = y.reshape(-1, 1)  
 
pred_data = np.linspace(0,10,100).reshape(-1,1) 
 
results = [] 
 

 
for i in [1, 2, 3] : 
 
    poly = PolynomialFeatures(degree = i) 
 
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0) 
 
    x_poly1 = poly.fit_transform(x_train) 
 
    pred_data = poly.fit_transform(pred_data) 
 
    linreg1 = LinearRegression().fit(x_poly1, y_train) 
 
    pred = linreg1.predict(pred_data) 
 
    results.append(pred) 
 
results 
 

しかし、私は私が欲しかったものを手に入れる、Pythonは(3、100)の配列を返していませんでした私は期待していたとして形状と、実際には、私はエラーメッセージを受信しませんでした

ValueError: shapes (100,10) and (4,1) not aligned: 10 (dim 1) != 4 (dim 0)

「再形成」または「fit_transform」ステップのいずれかに起因する寸法問題であると考えられます。これは簡単なテストであるはずだったので、私は混乱しました。誰も私にこのことを教えてくれますか?大変感謝しています。

ありがとうございます。敬具

、私はコメントで示唆されているように

+0

テストデータの場合は常に 'transform()'を、ケースの場合は 'pred_data'を呼び出してください。 'fit_transform()'は以前の呼び出しを忘れてしまい、データを再び覚えてしまい、次元が違う可能性があります。 –

+0

私はpred_dataにpoly.transform()を使用しようとしましたが、Pythonはまだエラーメッセージを返しました.Xシェイプはトレーニングシェイプと一致しません。 –

答えて

0

まず、あなたは常にだけtransform()テストデータ上(pred_dataあなたの場合)を呼び出す必要があります。

ただし、そうしても、別のエラーが発生します。エラーは、このラインによるものです:

pred_data = poly.fit_transform(pred_data)

ここでは、変換されたバージョンとオリジナルpred_dataを交換します。それは、形状の元pred_dataを必要とするので、ループの最初の反復のために、それが動作するが、第二及び第三の反復のためにそれが無効になる(100,1)forループ上の行で定義された:

pred_data = np.linspace(0,10,100).reshape(-1,1)

ループ内の変数名を別のものに変更すると、すべて正常に動作します。

for i in [1, 2, 3] : 
    poly = PolynomialFeatures(degree = i) 
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0) 
    x_poly1 = poly.fit_transform(x_train) 

    # Changed here 
    pred_data_poly1 = poly.transform(pred_data) 

    linreg1 = LinearRegression().fit(x_poly1, y_train) 
    pred = linreg1.predict(pred_data_poly1) 
    results.append(pred) 
results