【问题标题】:Pandas categorical variable transformationPandas 分类变量转换
【发布时间】:2016-08-01 16:12:14
【问题描述】:

数据.csv:param1,param2,param3,result 1,2,cat1,12 2,3,cat2,13 1,6,cat1,6 1,1,cat2,12

假设我从文件中读取数据并将分类变量转换为虚拟变量,如下所示:

import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression

data = pd.read_csv('data.csv')

type_dummies = pd.get_dummies(data.house_type)
data = pd.concat([data, type_dummies], axis=1)

我收到数据帧:

1,2,1,0,..
1,6,0,1,..

我对该数据集进行了简单的线性回归并获得了系数。如何使用 pandas 将新记录 (new_data = np.array([12,19,cat1])) 转换为 new_data = np.array([12,19,1,0)) 以在我的线性模型中使用它? (这样新的数据分类变量将被转换为虚拟变量)

【问题讨论】:

标签: python pandas


【解决方案1】:

通常您需要设置一个管道来记录正确的category:code 映射。

class CategoricalTransformer(TransformerMixin):

    def fit(self, X, y=None, *args, **kwargs):
        self.columns_ = X.columns
        self.cat_columns_ = X.select_dtypes(include=['category']).columns
        self.non_cat_columns_ = X.columns.drop(self.cat_columns_)

        self.cat_map_ = {col: X[col].cat.categories
                         for col in self.cat_columns_}
        self.ordered_ = {col: X[col].cat.ordered
                         for col in self.cat_columns_}

        self.dummy_columns_ = {col: ["_".join([col, v])
                                     for v in self.cat_map_[col]]
                               for col in self.cat_columns_}
        self.transformed_columns_ = pd.Index(
            self.non_cat_columns_.tolist() +
            list(chain.from_iterable(self.dummy_columns_[k]
                                     for k in self.cat_columns_))
        )

    def transform(self, X, y=None, *args, **kwargs):
        return (pd.get_dummies(X)
                  .reindex(columns=self.transformed_columns_)
                  .fillna(0))

更多here.

使用管道sklearn.pipeline.make_pipeline(CategoricalTransformer(), LinearRegression()),您的predict 方法应该正确地从分类house_type 转换为变量。

【讨论】:

  • 链接 tomaugspurger.github.io/categorical-pipelines.html 已失效。给出 404
猜你喜欢
  • 2022-07-14
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2017-02-18
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多