首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKlearn自动数据预处理

SKlearn自动数据预处理
EN

Code Review用户
提问于 2016-03-03 21:20:54
回答 1查看 84关注 0票数 1

我想为滑雪板模型做一个简单的包装。其思想是包装器自动处理各种因素("object"类型的列),用目标的平均值替换它们,同时保持sklearn模型的语法。

如果该因素太稀缺,则由目标的总体平均值取代。这似乎很简单,但当一个因素在测试组而不是在火车组时,就会出现问题。我想出了下面的解决方案,这让我觉得很尴尬。

代码语言:javascript
复制
class ModelEmbedder :

    def __init__(self, model, rare_threshold) :
        self.model = model
        self.means = {}
        self.rare_threshold = rare_threshold
        self.train = None
        self.origin_train = None
        self.average = 0


    def fit(self,train,target):
        self.origin_train = train.copy().fillna(-1)
        self.train = train.copy()
        self.train = self.train.fillna(-1)
        self.train['target'] = target
        self.average = target.mean()

        for feat in train.columns:
            if feat != 'target' :
                if self.train[feat].dtype=='object' :
                    self.train.loc[self.train[feat].value_counts()[self.train[feat]].values <  self.rare_threshold, feat] = "RARE"
                    self.origin_train.loc[self.origin_train[feat].value_counts()[self.origin_train[feat]].values <  self.rare_threshold, feat] = "RARE"
                    self.means[feat] = self.train.groupby([feat])['target'].mean()
                    self.means[feat]["RARE"] = self.average

                    self.train[feat] = self.train[feat].replace(self.means[feat], inplace=False)

        del self.train['target']

        self.model.fit(self.train,target)

    def _pre_treat_test(self,test) :
        test = test.copy()
        test = test.fillna(-1)

        for feat in self.origin_train.columns:
            if self.origin_train[feat].dtype=='object' :
                test.loc[self.origin_train[feat].value_counts()[self.origin_train[feat]].values  <  self.rare_threshold, feat] = "RARE"

                criterion = ~test[feat].isin(set(self.origin_train[feat]))

                test.loc[criterion,feat] = self.average


                test[feat]  = test[feat].replace(self.means[feat], inplace=False)

        return test        

    def predict_proba(self,test) :
        test = self._pre_treat_test(test)
        return self.model.predict_proba(test)

    def get_params(self, deep = True):
        return self.model.get_params(deep)

然后,每个模型都可以包装:

代码语言:javascript
复制
rf = ensemble.ExtraTreesClassifier(n_jobs=7, 
    n_estimators = n_estimators, 
    random_state = 11)

rf_embedded = model_embedder.ModelEmbedder(rf,10)

并发送到交叉验证循环或任何管道。

EN

回答 1

Code Review用户

回答已采纳

发布于 2016-03-12 02:27:29

几点意见:

  • 您将在大部分:之前添加空格,这听起来很奇怪。我会删除它,因为我从来没有见过任何其他Python代码这样做
  • 我将检查Pep8作为清理各种格式的方法,因为它或多或少是公认的Python格式标准。
    • 这将显示诸如运算符周围缺少空格、行间隔过多等问题。

另外,我不知道你在这里是如何使用下划线的。一般来说,下划线表示Python中的私有成员/方法和它看起来有相当多的地方,您可以使您的成员变量私有。

此外,这一点可能会更加明确:

代码语言:javascript
复制
self.train.loc[self.train[feat].value_counts()[self.train[feat]].values <  self.rare_threshold, feat] = "RARE"

您可以考虑一些中间步骤来帮助提高可读性。即使是像这样简单的事情:

代码语言:javascript
复制
val = self.train[feat].value_counts()[self.train[feat]].values <  self.rare_threshold
self.train.loc[val, feat] = "RARE"

更清楚。尝试读取许多嵌套字典查找并不简单。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/121833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档