机器学习-----特征工程

很兴奋我们终于来到了机器学习的正题,这是一个庞大的方向,我们学习的只是一些基本方法,真正熟练运用需要很多其他学科比如数理统计线性代数的知识融会贯通。开始学习吧。
一些机器学习的基本概念相信大家或多或少都了解,这里就不再赘述了。我们来看看特征工程。
1、为什么需要特征工程?
在现实工作中,数据很少会这么干净。因此,机器学习实践中更重要的步骤之一是特征工程(feature engineering)——找到与问题有关的任何信息,把它们转换成特征矩阵的数值。个人理解就是先要通过一些方法找出有效的信息,然后向量化方便计算。特征工程有时候决定了一个项目的准确率高低。有句话说得好“数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”。其重要性可见一斑。

2、 分类特征(one-hot编码)
一种常见的非数值数据类型是分类数据。例如,浏览房屋数据的时候, 除了看到“房价”(price)和“面积”(rooms)之类的数值特征,还会 有“地点”(neighborhood)信息,数据可能像这样:
data = [ {‘price’: 850000, ‘rooms’: 4, ‘neighborhood’: ‘Queen Anne’},
{‘price’: 700000, ‘rooms’: 3, ‘neighborhood’: ‘Fremont’},
{‘price’: 650000, ‘rooms’: 3, ‘neighborhood’: ‘Wallingford’},
{‘price’: 600000, ‘rooms’: 2, ‘neighborhood’: ‘Fremont’} ]
对于neighborhood,我们可能想到用整数1,2,3表示三个不同的地点,但是,在 Scikit-Learn 中这么做并不是一个好办法:这个程序包的所有 模块都有一个基本假设,那就是数值特征可以反映代数量(algebraic quantities)。因此,这样映射编码可能会让人觉得存在 Queen Anne < Fremont < Wallingford,甚至还有 Wallingford - Queen Anne = Fremont,这是不符合实际的。后面我会说一下scikit-learn模块。
所以我们的办法是采用独热编码形式表示邻居这个属性。

from sklearn.feature_extraction import DictVectorizer 
vec = DictVectorizer(sparse=False, dtype=int) 
vec.fit_transform(data) 
Out[3]: array([[ 0, 1, 0, 850000, 4], 
[ 1, 0, 0, 700000, 3], 
[ 0, 0, 1, 650000, 3], 
[ 1, 0, 0, 600000, 2]], dtype=int64)

我们可以看到,我们增加了矩阵的列数3个,每个列有1代表在那个地点,其他列为0,当你的数据 是像上面那样的字典列表时,用 Scikit- Learn 的 DictVectorizer 类就可以实现。(有的编译器要加print打印才能看到结果)
但这种方法也有一个显著的缺陷:如果你的分类特征有许多枚举值,那 么数据集的维度就会急剧增加。然而,由于被编码的数据中有许多 0, 因此用稀疏矩阵表示会非常高效:

vec = DictVectorizer(sparse=True, dtype=int) 
vec.fit_transform(data) 
Out[5]: <4x5 sparse matrix of type '<class 'numpy.int64'>' with 12 stored elements in Compressed Sparse Row format>

在拟合和评估模型时,Scikit-Learn 的许多(并非所有)评估器都支持 稀疏矩阵输入, sklearn.preprocessing.OneHotEncoder 和 sklearn.feature_extraction.FeatureHasher 是 Scikit-Learn 另外 两个为分类特征编码的工具。

2、文本特征
另一种常见的特征工程需求是将文本转换成一组数值。例如,绝大多数社交媒体数据的自动化采集,都是依靠将文本编码成数字的技术手段。 数据采集最简单的编码方法之一就是单词统计:给你几个文本,让你统计每个词出现的次数,然后放到表格中。

from sklearn.feature_extraction.text import CountVectorizer 
import pandas as pd 
#pd.DataFrame(X.toarray(), columns=vec.get_feature_names())
sample = ['problem of evil', 'evil queen', 'horizon problem']
vec = CountVectorizer() 
X = vec.fit_transform(sample)
X1=pd.DataFrame(X.toarray(), columns=vec.get_feature_names())
print(X1)

     evil  horizon  of  problem  queen
0     1        0   1        1      0
1     1        0   0        0      1
2     0        1   0        1      0

结果是一个稀疏矩阵,里面记录了每个短语中每个单词的出现次数。
不过这种统计方法也有一些问题:原始的单词统计会让一些常用词聚集太高的权重,在分类算法中这样并不合理。解决这个问题的方法就是通 过 TF–IDF(term frequency–inverse document frequency,词频逆文档频率),通过单词在文档中出现的频率来衡量其权重 。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF实际上是:TF * IDF
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
计算这些特征的语法和之前的示例类似:

 from sklearn.feature_extraction.text import TfidfVectorizer 
import pandas as pd 
sample = ['problem of evil', 'evil queen', 'horizon problem']
vec = TfidfVectorizer() 
X = vec.fit_transform(sample) 
print(pd.DataFrame(X.toarray(), columns=vec.get_feature_names()) )

3、衍生特征
还有一种有用的特征是输入特征经过数学变换衍生出来的新特征。我们发 现将一个线性回归转换成多项式回归时,并不是通过改变模型来实现, 而是通过改变输入数据!这种处理方式有时被称为基函数回归。
x = np.array([1, 2, 3, 4, 5]) y = np.array([4, 2, 1, 3, 7]) plt.scatter(x, y);
在这里插入图片描述
例如,上面的数据显然不能用一条直线描述。
很显然,我们需要用一个更复杂的模型来描述 x 与 y 的关系。可以对数据进行变换,并增加额外的特征来提升模型的复杂度。例如,可以在数据中增加多项式特征:

 from sklearn.preprocessing import PolynomialFeatures 
 poly = PolynomialFeatures(degree=3, include_bias=False)#degree代表最多到几次方
 X=x[:, np.newaxis]
 X2 = poly.fit_transform(X) 
 print(X2)
 [[ 1. 1. 1.] 
 [ 2. 4. 8.] 
 [ 3. 9. 27.] 
 [ 4. 16. 64.] 
 [ 5. 25. 125.]]

在衍生特征矩阵中,第 1 列表示 x,第 2 列表示 x2,第 3 列表示 x3。通 过对这个扩展的输入矩阵计算线性回归,就可以获得更接近原始数据的结果了。
在这里插入图片描述
这种不通过改变模型,而是通过变换输入来改善模型效果的理念,正是 许多更强大的机器学习方法的基础。它通常被认为是强大的核方法(kernel method,后面详细介绍)技术的驱动力之一。

4、缺失值填充
这应该是数据清洗很重要的一步,我们通常用所在列的平均值,中值,众数填充,方法也很简单。
from sklearn.preprocessing import Imputer
imp = Imputer(strategy=‘mean’)
X2 = imp.fit_transform(X)
这个知识点就不再过多介绍了,但这是特征工程中很基础的一步。

猜你喜欢

转载自blog.csdn.net/weixin_53344209/article/details/114408844