Pandas范畴变量转换



Data.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,..

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

通常,您需要设置一个管道来记录正确的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))

点击此处了解更多信息。

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

最新更新