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
转换为变量。