Imputer Iteratif Scikit-learn dapat menghitung nilai yang hilang dengan cara round-robin. Untuk mengevaluasi kinerjanya terhadap regressor konvensional lainnya, dimungkinkan untuk membangun pipeline sederhana dan mendapatkan metrik penilaian dari cross_val_score. Masalahnya adalah Iterative Imputer tidak memiliki metode 'prediksi' sesuai kesalahan:

AttributeError: 'IterativeImputer' object has no attribute 'predict'

Lihat contoh minimum dari apa yang ingin dicapai:

# import libraries
import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline

# define scaler, model and pipeline
scaler = StandardScaler() # use any scaler
imputer = IterativeImputer() # with any estimator, default = BayesianRidge()
pipeline = Pipeline(steps=[('s', scaler), ('i', imputer)])

train, test = df.values, df['A'].values 
scores = cross_val_score(pipeline, train, test, cv=10, scoring='r2')
print(scores)

Solusi apa yang mungkin ada? Jika pembungkus khusus diperlukan, bagaimana seharusnya ditulis untuk menyertakan metode 'prediksi'?

0
A.M. 9 Mei 2021, 01:37

1 menjawab

Jawaban Terbaik

cross_val_score membutuhkan pipeline dengan model di akhir (yang memiliki predict)

scaler  = StandardScaler()
imputer = IterativeImputer()
model   = BayesianRidge()  # any model

pipeline = Pipeline(steps=[('s', scaler), ('i', imputer), ('m', model)])

cross_val_score tanpa model tidak masuk akal.


Saya juga melihat masalah lain - dengan nilai train, test yang Anda gunakan di cross_val_score.

Seharusnya X, y bukan train, test tetapi itu hanya nama sehingga tidak begitu penting tetapi penting adalah apa yang Anda tetapkan ke variabel.

Masalahnya adalah X seharusnya tanpa y tetapi Anda menggunakan train = df.values sehingga Anda membuat X dengan y

df_train = pd.DataFrame({
                'X': range(20), 
                'y': range(20),
           })

X_train = df_train[ ['X'] ]  # it needs inner `[]` to create DataFrame, not Series
y_train = df_train[  'y'  ]  # it has to be single column (Series)

scores = cross_val_score(pipeline, X_train, y_train, cv=10, scoring='r2')

(BTW: Anda tidak harus menggunakan .values)

Sama dengan lebih banyak kolom

df_train = pd.DataFrame({
                'A': range(20), 
                'B': range(20), 
                'y': range(20),
           })

X_train = df_train[ ['A', 'B'] ]
y_train = df_train[ 'y' ]

Kode kerja minimal tetapi dengan data palsu (yang tidak berguna)

# import libraries
import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.linear_model import BayesianRidge

df_train = pd.DataFrame({
                'A': range(100),  # fake data
                'B': range(100),  # fake data
                'y': range(100),  # fake data
           })

df_test = pd.DataFrame({
                'A': range(20),  # fake data
                'B': range(20),  # fake data
                'y': range(20),  # fake data
           })

# define scaler, model and pipeline
scaler  = StandardScaler()
imputer = IterativeImputer()
model   = BayesianRidge()

pipeline = Pipeline(steps=[('s', scaler), ('i', imputer), ('m', model)])

X_train = df_train[ ['A', 'B'] ]  # it needs inner `[]` to create DataFrame, not Series
y_train = df_train[ 'y' ]         # it has to be single column (Series)

scores = cross_val_score(pipeline, X_train, y_train, cv=10, scoring='r2')
print(scores)

X_test = df_test[['A', 'B']]
y_test = df_test['y']

scores = cross_val_score(pipeline, X_test, y_test, cv=10, scoring='r2')
print(scores)
1
furas 9 Mei 2021, 06:33