如何在机器学习的训练集中结合文本和数字特征?

Posted

技术标签:

【中文标题】如何在机器学习的训练集中结合文本和数字特征?【英文标题】:How to Combine text and numerical features in training sets for machine learning? 【发布时间】:2018-05-10 17:13:45 【问题描述】:

我正在尝试创建一个有监督的机器学习模型,以基于数字特征和文本特征来预测属于 benignmalicious 类的给定 URL 的概率。

数值特征 -

网址长度 主域长度 点数 包含IP等

文字特征 -

注册商名称 注册人姓名 国家 URL 等中的单词列表

我有具有所需功能的数据框,但我不知道如何处理文本数据。有人可以指导我吗?

以下是我拥有的示例数据框-

   url_length    length_domain    is_ip    registrar    registrants    tokens_in_url
0      50              18           0         a1            z1        [abc, def, ghi, jkl]
1      98              23           0         a2            z2        [mno, pqr, stu]
2      146             8            0         a3            z3        [vwx, yz]

提前致谢。

【问题讨论】:

对属于分类数据的文本特征使用 OneHotEncoder。供参考OneHotEncoder@NileshShaikh 你甚至可以分析,数据中的特征对目标的贡献,可能在scikit-learn.org/stable/auto_examples/ensemble/…的帮助下,当然你会做典型的频率分布、相关性等, 【参考方案1】:

要结合文本特征和数字特征,请遵循以下步骤:

对于文本特征,使用 BoW、TFIDF、AvgW2V、TFIDFW2V 任何这些文本特征向量化技术对其进行向量化。 对于数值特征,使用归一化或列标准化来缩放数值数据。 如果您还想使用分类特征,请使用 OneHotEncoding、LabelEncoding、ResponseCoding 等,对分类特征进行矢量化处理。 使用 hstack 将所有功能放在一个数据帧中。 例如。 X_tr=hstack((vectorised_text_features....,standardised_numerical_features...,standardised_categorical_features...)) 而且,您的火车数据已准备就绪。现在,可以进行建模了。

【讨论】:

【参考方案2】:

考虑以下演示:

来源 DF:

In [113]: df
Out[113]:
    registrar   registrant   country
0  registrar1  registrant1  country1
1  registrar8  registrant2  country2
2  registrar1  registrant3  country1
3  registrar5  registrant4  country3

编码:

In [114]: from sklearn.preprocessing import LabelEncoder

In [115]: str_cols = df.columns[df.dtypes.eq('object')]

In [116]: clfs = c:LabelEncoder() for c in str_cols

In [117]: for col, clf in clfs.items():
     ...:     df[col] = clfs[col].fit_transform(df[col])
     ...:

In [118]: df
Out[118]:
   registrar  registrant  country
0          0           0        0
1          2           1        1
2          0           2        0
3          1           3        2

逆变换:

In [119]: clfs['country'].inverse_transform(df['country'])
Out[119]: array(['country1', 'country2', 'country1', 'country3'], dtype=object)

更新:

是否可以在给定的情况下使用 TF-IDF(URL 中的单词列表) 回答?

In [86]: from sklearn.feature_extraction.text import TfidfVectorizer

In [87]: vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='word', stop_words='english')

In [88]: X = vect.fit_transform(df['tokens_in_url'].str.join(' '))

In [89]: X
Out[89]:
<3x9 sparse matrix of type '<class 'numpy.float64'>'
        with 9 stored elements in Compressed Sparse Row format>

In [90]: X.A
Out[90]:
array([[ 0.5       ,  0.5       ,  0.5       ,  0.5       ,  0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.57735027,  0.57735027,  0.57735027,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,  0.        ,  0.        ,  0.70710678,  0.70710678]])


In [91]: vect.get_feature_names()
Out[91]: ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu', 'vwx', 'yz']

In [92]: tok = pd.SparseDataFrame(X, columns=vect.get_feature_names(), index=df.index, default_fill_value=0)

In [93]: tok
Out[93]:
   abc  def  ghi  jkl      mno      pqr      stu       vwx        yz
0  0.5  0.5  0.5  0.5  0.00000  0.00000  0.00000  0.000000  0.000000
1  0.0  0.0  0.0  0.0  0.57735  0.57735  0.57735  0.000000  0.000000
2  0.0  0.0  0.0  0.0  0.00000  0.00000  0.00000  0.707107  0.707107

【讨论】:

这一位队友有点丢了。这真的是以机器学习的最佳方式结合数字和文本输入吗? @roganjosh,很可能不是。如果不同列中有太多不同的值,这可能会有所帮助... 我觉得这个有点宽泛。国家可以用作一个类别,但我认为这可以归结为模型选择和数据准备。 @MaxU,是否可以在给定答案的情况下使用 TF-IDF(URL 中的单词列表)? @NileshShaikh,你能提供一个小的可重复数据集吗?

以上是关于如何在机器学习的训练集中结合文本和数字特征?的主要内容,如果未能解决你的问题,请参考以下文章

文本分类(机器学习方法)

文本分类(机器学习方法)

零基础学Python--机器学习:特征提取

机器学习之决策树

机器学习之聚类

机器学习之聚类