scikit-learn: fit () не может включить sample_weight, когда задействован конвейер - PullRequest
1 голос
/ 11 июля 2019

Я использую код Scikit-Learn от других для создания инструмента прогнозирования. Исходный код работает просто отлично, но мне нужно добавить sample_weight в инструмент прогнозирования.

После поиска решений в другой документации я обнаружил, что основная проблема заключается в том, что конвейер в Scikit-Learn не очень хорошо поддерживает sample_weight.


# creating pipeline
pipeline = make_pipeline(preprocessing.StandardScaler(), RandomForestRegressor(n_estimators=100))

hyperparameters = {'randomforestregressor__max_features': ['auto'],
                   'randomforestregressor__max_depth': [None]   }


clf = GridSearchCV(pipeline, hyperparameters, cv=10, verbose=10)

clf.fit(X_train, Y_train
        #        , fit_params={'sample_weight': W_train}
        # , fit_params={'sample_weight':W_train}
        # , **{'randomforestregressor__sample_weight': W_train}
        )

# testing model
pred = clf.predict(X_test)
r2_score(Y_test, pred)
mean_squared_error(Y_test, pred)
print(r2_score(Y_test, pred))
print(mean_squared_error(Y_test, pred))


# 保存模型以便将来使用
joblib.dump(clf, 'rf_regressor.pkl')

Я пытался вставить sample_weight в разных местах, но все это показывает сбой. Может кто-нибудь помочь скажите мне, где вставить sample_weight с pipeline на месте, ИЛИ реализовать шаги (включая sample_weight) без использования pipeline?

1 Ответ

0 голосов
/ 11 июля 2019

Я думаю, проблема должна быть в W_train, потому что найдите мой пример ниже с вашим кодом, который работает довольно хорошо.

from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import GridSearchCV

# creating pipeline
pipeline = make_pipeline(StandardScaler(),
                         RandomForestRegressor(n_estimators=100))


from sklearn.datasets import load_diabetes

X, y = load_diabetes(return_X_y=True)
hyperparameters = {'randomforestregressor__max_features': ['auto'],
                   'randomforestregressor__max_depth': [None]   }


clf = GridSearchCV(pipeline, hyperparameters, cv=10, verbose=10)

clf.fit(X , y,
        **{'randomforestregressor__sample_weight': np.random.choice([0,2,3,5],size=len(X))})

#
Fitting 10 folds for each of 1 candidates, totalling 10 fits
[CV] randomforestregressor__max_depth=None, randomforestregressor__max_features=auto 
[CV]  randomforestregressor__max_depth=None, randomforestregressor__max_features=auto, score=0.385, total=   0.2s
...
...