Я использую пакет GridSearchCV из sklearn в Python, и я хотел бы использовать его с пользовательской функцией оценки.Пользовательская функция скоринга должна была бы получить доступ к переменным, которых нет в модели.Дело в том, что я не могу получить доступ к переменным, которые не масштабируются / не изменяются из обучающего набора, поскольку они не включены в модель, которая использует масштабированные данные, и так как gridsearch выбирает строки случайным образом для каждой партии.Есть ли у вас какие-либо идеи о том, как я могу с этим справиться?
Я пытался создать функцию оценки, которая принимает в качестве параметра исходный (немасштабированный, неизменный) обучающий набор.Это работает, но так как gridsearch берет только подмножества обучающего набора, и строки перемешиваются, я не могу «соединить» каждую строку с соответствующим значением в исходном обучающем наборе.Я пытался удалить данные, включенные в тренировочный набор, но это не сработало.Я думал о добавлении немасштабированного столбца, который я хочу, к масштабированному обучающему набору, но как я могу исключить его из модели?
# building pipelines
from sklearn.preprocessing import OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
num_pipeline = Pipeline([
('std_scaler', StandardScaler()),
],verbose=True)
cat_pipeline = Pipeline([
('one_hot_enc',OneHotEncoder(sparse=False,handle_unknown='ignore')),
],verbose=True)
from sklearn.compose import ColumnTransformer
full_pipeline = ColumnTransformer([
("num", num_pipeline, df_num_reg_attributes),
("cat", cat_pipeline, df_cat_attributes)
])
# fitting pipelines
X_train_prepared_reg = full_pipeline.fit_transform(X_res_df)
listColPrepared=np.concatenate((df_num_reg_attributes,full_pipeline.named_transformers_['cat'].named_steps['one_hot_enc'].get_feature_names()))
scalerX_train = full_pipeline.named_transformers_['num'].named_steps['std_scaler']
X_test_prepared_reg = full_pipeline.transform(X_test)
y_train = y_balanced
# scorer
def my_scorer(clf, X, y_true):
DCWorkCost = 5.00
OPWorkCost = 2.50
mergedDataset = pd.DataFrame(data=X,index=np.arange(0,len(X)),columns=listColPrepared)
### this is the column I want -- I tried to unscale the data to access the column but it did not work
mergedDataset['Margin'] = scalerX_train.inverse_transform(mergedDataset['Margin'])
mergedDataset['True'] = y_true
mergedDataset['Pred'] = clf.predict(X)
# rest of the scorer.........
return revenue
# grid search
sgd_clf_cv = SGDClassifier(max_iter=5,tol=-np.infty, random_state=42)
parameters = {'class_weight':({0:.1,1:.9},{0:.2,1:.8},{0:.3,1:.7},{0:.25,1:.75},{0:.15,1:.85},{0:.35,1:.65},{0:.4,1:.6})}
grid = GridSearchCV(estimator=sgd_clf_cv, param_grid=parameters, scoring=my_scorer,verbose=10)
grid.fit(X_train_prepared_reg, y_train)
grid.best_estimator_
При попытке масштабировать данные, как показано в коде, я получаю сообщение об ошибкео несоответствующих формах.