2

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

我正在使用库 sklearn_pandas 中的 DataFrameMapper。

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

如前所述,前 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

4

2 回答 2

2

您制作的映射器具有属性“功能”。您可以使用它来访问 LabelBinarizers 和它创建的 'classes_':

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
于 2016-08-02T09:08:06.370 回答
2

结合 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 来表示“什么都不做”。
于 2015-09-22T08:20:34.093 回答