有没有办法在sklearn中的LabelBinarizer Transform之后跟踪哪个DataFrame Column对应于哪个Array Column?

Posted

技术标签:

【中文标题】有没有办法在sklearn中的LabelBinarizer Transform之后跟踪哪个DataFrame Column对应于哪个Array Column?【英文标题】:Is there a way to track which DataFrame Column corresponds to which Array Column(s) after LabelBinarizer Transform in sklearn? 【发布时间】:2015-12-18 07:33:14 【问题描述】:

我有一系列字符串类型的变量,我必须对它们进行转换才能使用 sklearn 估计器。

我正在使用库 sklearn_pandas 中的 DataFrameMapper。

在下面的示例中,我有一个包含 A、B、C、D、E 列的数据框。假设“A”、“B”和“C”是字符串特征:A 有 25 个唯一字符串,B 有 10 个唯一字符串,C 有 30 个唯一字符串。在通过 LabelBinarizer() 转换数据后,相应的矩阵将具有 25+ 10+ 30+ 1(来自 D)+1(来自 E)= 67 个特征我怎么知道哪一列对应每个原始变量之前的字符串值?

如前所述,前 3 个是字符串变量,所以我必须进行以下转换:

    mapper = DataFrameMapper([
    ('A', LabelBinarizer()),
    ('B', LabelBinarizer()),
    ('C', LabelBinarizer()), (['D','E'],StandardScaler())])

    X = np.array(mapper.fit_transform(df),dtype=float)

其中 X 是大小为 (num_features)*67 的矩阵

【问题讨论】:

如果可能,在 A、B 和 C 上分别使用 LabelBinarizer 可能会更容易;您可以看到字符串与classes_ 的列是如何对应的。最后,您可以沿第 0 轴与 np.append(A, B, axis=0) 连接以获得您的 X 是的@Ryan,这是一种或另一种方式,请参阅我发布的答案。 【参考方案1】:

结合 DictVectorizer() 和映射器,可以跟踪列变量名称。如果想用 export_graphviz 可视化决策树,这很有用。

答案基于:http://nbviewer.ipython.org/github/rasbt/pattern_classification/blob/master/preprocessing/feature_encoding.ipynb

    from sklearn.feature_extraction import DictVectorizer
    dvec = DictVectorizer(sparse=False)
    X=dvec.fit_transform(df.transpose().to_dict().values())
    df_t= pd.DataFrame(X,columns=dvec.get_feature_names())

df 是输入 DataFrame,其中 A、B、C 是分类特征。 df_t 是转换后的 DataFrame,分类特征用相应的标头编码。

然后您可以缩放其他数字特征 D、E 并将所有内容转换为 numpy 数组以在 sklearn 中使用。

numerical=['D','E']
categorical=list(set(list(df_t.columns.values))-set(numerical))

mapper = DataFrameMapper([
(categorical, None), 
(numerical,StandardScaler())])

explanatory_variables_columns=categorical+numerical
X = np.array(mapper.fit_transform(df_t),dtype=float)
虽然没有对“A”、“B”和“C”进行转换,但您必须将它们包含在映射器中并使用 None 来表示“什么都不做”。

【讨论】:

【参考方案2】:

您制作的映射器有一个属性“特征”。您可以使用它来访问 LabelBinarizers 和它创建的“类_”:

result_list = []

for feature in mapper.features:
    try:
        for feature_value in feature[1].classes_:
            result_list.append(feature[0]+'_'+feature_value)
    except:
        result_list.append(feature[0])  

我添加了 try 和 except 子句,以防您在映射器还包含未二值化的列(并且不包含任何类)时使用它。

如果您有 sklearn 管道,则可以将 mapper.features 替换为:

pipeline.named_steps['mapper'].features

【讨论】:

以上是关于有没有办法在sklearn中的LabelBinarizer Transform之后跟踪哪个DataFrame Column对应于哪个Array Column?的主要内容,如果未能解决你的问题,请参考以下文章

R和sklearn中的随机森林

Sklearn:有没有办法调试管道?

有没有办法使用 SKlearn 获得滑动嵌套交叉验证?

Sklearn:有没有办法为管道定义特定的分数类型?

sklearn.linear_model.ridge 中的统计汇总表?

有没有办法适当调整这个 sklearn 逻辑回归函数来解释多个自变量和固定效应?