gpt4 book ai didi

python - 如何更新 sklearn 类中的 fit 方法?

转载 作者:行者123 更新时间:2023-11-30 09:15:18 25 4
gpt4 key购买 nike

我最近开始使用 GridSearchCV,对面向对象编程不太熟悉。

问题:我的一个预测变量中有一些丢失的数据,并且我有一个想要与适当的参数网格一起使用的算法列表。我想知道是否有一种方法可以创建一个自定义类,在拟合数据之前以不同的方式估算数据中的缺失值,并为我同时使用的任何算法尝试不同的属性组合。这可能吗?

非常感谢您的帮助!

这是我创建的一个类,用于在房价数据集的 SQFT 列中估算缺失值:

class Impute_sqft():

train_X = houses_dummies_copy.dropna(subset=['sqft']).drop(columns=['sqft', 'final_price'])
train_Y = houses_dummies_copy.dropna(subset=['sqft'])['sqft']
test_X = houses_dummies_copy[pd.isna(houses_dummies_copy.sqft)].drop(columns=['sqft', 'final_price'])


def __init__(self, how='random forest'):
self.how = how

def impute(self):

# replace missing values with the ones predicted by random forest
if self.how == 'random forest':
houses_dummies_copy = houses_dummies.copy()
rf = RandomForestRegressor()
rf.fit(train_X, train_Y)
pred_Y = rf.predict(test_X)
houses_dummies_copy.loc[test_X.index,'sqft'] = pred_Y
return houses_dummies_copy[predictors]

# replace missing values with the ones predicted by knn
if self.how == 'knn':
houses_dummies_copy = houses_dummies.copy()
import sys
from impyute.imputation.cs import fast_knn
sys.setrecursionlimit(100000)
knn_n = 30
result = fast_knn(houses_dummies_copy[predictors], k=knn_n)
result.columns = houses_dummies_copy[predictors].columns
return result

# replace missing values with the mean for every type of property
if self.how == 'mean':
houses_dummies_copy = houses_dummies.copy()
sqft_statistics = []
for house_type in houses_types:
statistic = houses_dummies_copy[houses_dummies_copy['type_' + house_type] == 1].sqft.mean(skipna=True)
indexes = houses_dummies_copy[(houses_dummies_copy['type_' + house_type] == 1) & pd.isna(houses_dummies_copy.sqft)].index
houses_dummies_copy.loc[indexes, 'sqft'] = statistic
return houses_dummies_copy[predictors]



我有什么网格用于 GridSearchCV:

param_grid = [{
'bootstrap': [True, False],
'n_estimators': [3, 10],
'max_features': [2, 3, 4]
}]

我想要 GridSearchCV 的网格:

param_grid = [{
'bootstrap': [True, False],
'n_estimators': [3, 10],
'max_features': [2, 3, 4],
'sqft_imputer': ['random forest', 'knn', 'mean']

}]

最佳答案

您想要的是创建一个自定义Transformer,并在Pipeline中的估算器之前使用它。

自定义变压器:

看一下模板:TemplateTransformer .

一些评论:

  • 您需要继承BaseEstimator
  • 必须在类的 __init__ 方法中定义 self.how 的选择。
  • 为了保证正确性,您需要在拟合期间估计统计数据,并在转换期间应用它们。 (另见Why does sklearn Imputer need to fit?)

管道

要链接您的自定义输入器和估计器,您可以使用 scikit-learn Pipeline :

  • 例如,参见 example ,它在 Pipeline 中链接 PCALogisticRegression,然后在 GridSearchCV 中使用它。<
  • 您需要使用管道中使用的名称更改参数网格,例如
param_grid = [{
'estimator__bootstrap': [True, False],
'estimator__n_estimators': [3, 10],
'estimator__max_features': [2, 3, 4],
'imputer__how': ['random forest', 'knn', 'mean']

}]

关于python - 如何更新 sklearn 类中的 fit 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57514912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com