赞
踩
为了提取知识和做出预测,机器学习使用数学模型来拟合数据。这些模型将特征作为输入。特征就是原始数据某个方面的数值表示。在机器学习流程中,特征是数据和模型之间的纽带。特征工程是指从原始数据中提取特征并将其转换为适合机器学习模型的格式。它是机器学习流程中一个极其关键的环节,因为正确的特征可以减轻构建模型的难度,从而使机器学习流程输出更高质量的结果。
“数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这句话很好的阐述了数据在机器学习中的重要性。大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据,那么需要进行一些特征处理,特征的缩放等等,满足训练数据的要求。
例如:你要查看不同地域女性的穿衣品牌情况,预测不同地域的穿衣品牌。如果其中含有一些男性的数据,是不是要将这些数据给去除掉
特征工程中最重要的一个环节就是特征处理,特征处理包含了很多具体的专业技巧
自2007年发布以来,scikit-learn
已经成为最给力的Python
机器学习库(library)了。scikit-learn
支持的机器学习算法包括分类,回归,降维和聚类。还有一些特征提取(extracting features)
、数据处理(processing data)
和模型评估(evaluating models)
的模块。作为Scipy库的扩展,scikit-learn也是建立在Python的NumPy和matplotlib库基础之上。NumPy可以让Python支持大量多维矩阵数据的高效操作,matplotlib提供了可视化工具,SciPy带有许多科学计算的模型。scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。开发者用scikit-learn实验不同的算法,只要几行代码就可以搞定。scikit-learn包括许多知名的机器学习算法的实现,包括LIBSVM和LIBLINEAR。还封装了其他的Python库,如自然语言处理的NLTK库。另外,scikit-learn内置了大量数据集,允许开发者集中于算法设计,节省获取和整理数据集的时间。
现实世界中多数特征都不是连续变量,比如分类、文字、图像等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,因此就用到了特征提取. sklearn.feature_extraction
提供了特征提取的很多方法
我们将城市和环境作为 字典数据,来进行特征的提取。(字典特征抽取)
sklearn.feature_extraction.DictVectorizer(sparse = True)
将映射列表转换为Numpy
数组或scipy.sparse
矩阵
-sparse
是否转换为scipy.sparse
矩阵表示,默认开启
DictVectorizer语法:
- DictVectorizer.fit_transform(X)
- x:字典或者包含字典的迭代器
- 返回值:返回sparse矩阵
- DictVectorizer.inverse_transform(x)
- x: array数组或者sparse矩阵
- 返回值:转换之前的数据格式
- DictVectorizer.get_feature_names()
- 返回类别名称
- DictVectorize.transform(x)
- 按照原先的标准转换
流程:
from sklearn.feature_extraction import DictVectorizer
onehot = DictVectorizer() # 如果结果不用toarray,请开启sparse=False
instances = [{'city': '北京','temperature':100},{'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances).toarray()
print(onehot.inverse_transform(X))
文本的特征提取应用于很多方面,比如说文档分类、垃圾邮件分类和新闻分类。那么文本分类是通过词是否存在、以及词的概率(重要性)来表示。
文档的中词的出现
数值为1表示词表中的这个词出现,为0表示未出现
sklearn.feature_extraction.text.CountVectorizer()
将文本文档的集合转换为计数矩阵
CountVectorizer语法:
CountVectorizer(max_df=1.0,min_df=1,…)
- 返回词频矩阵
- CountVectorizer。fit_transform(x,y)
- x:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
- CountVectorizer.inverse_trasnform(x)
- x:array数组或者sparse矩阵
- 返回值:转换之前数据格式
- CountVectorizer.get_feature_names()
- 返回值:单词列表
归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,这样比较起来才有意义,其次可以程序可以运行更快。
常用的方法是通过对原始数据进行线性变换把数据映射到[0,1]之间,变换的函数为:
min-max方法
X ’ = x − m i n m a x − m i n X^’ = \frac{x-min}{max-min} X’=max−minx−min
scikit-learn.preprocessing
中的类MinMaxScaler
,将数据矩阵缩放到[0,1]之间
>>> X_train = np.array([[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]])
...
>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5 , 0. , 1. ],
[ 1. , 0.5 , 0.33333333],
[ 0. , 1. , 0. ]])
常用的方法是z-score
标准化,经过处理后的数据均值为0,标准差为1,处理方法是:
X
‘
=
x
−
u
σ
X^ `=\frac{x-u}{\sigma}
X‘=σx−u
其中
μ
\mu
μ是样本的均值,
σ
\sigma
σ是样本的标准差,它们可以通过现有的样本进行估计,在已有的样本足够多的情况下比较稳定,适合嘈杂的数据场景
sklearn中提供了StandardScalar类实现列标准化:
In [2]: import numpy as np
In [3]: X_train = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])
In [4]: from sklearn.preprocessing import StandardScaler
In [5]: std = StandardScaler()
In [6]: X_train_std = std.fit_transform(X_train)
In [7]: X_train_std
Out[7]:
array([[ 0. , -1.22474487, 1.33630621],
[ 1.22474487, 0. , -0.26726124],
[-1.22474487, 1.22474487, -1.06904497]])
由于各种原因,许多现实世界的数据集包含缺少的值,通常编码为空白,NaN
或其他占位符。然而,这样的数据集与scikit
的分类器不兼容,它们假设数组中的所有值都是数字,并且都具有和保持含义。使用不完整数据集的基本策略是丢弃包含缺失值的整个行和/或列。然而,这是以丢失可能是有价值的数据(即使不完整)的代价。更好的策略是估算缺失值,即从已知部分的数据中推断它们。
(1)填充缺失值 使用sklearn.preprocessing中的Imputer类进行数据的填充
>>> import numpy as np
>>> from sklearn.preprocessing import Imputer
>>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
>>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])
Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
>>> X = [[np.nan, 2], [6, np.nan], [7, 6]]
>>> print(imp.transform(X))
[[ 4. 2. ]
[ 6. 3.666...]
[ 7. 6. ]]
降维
PCA(Principal component analysis)
,主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA
极其容易受到数据中特征范围影响,所以在运用PCA
前一定要做特征标准化,这样才能保证每维度特征的重要性等同。
sklearn.decomposition.PCA
>>> import numpy as np
>>> from sklearn.decomposition import PCA
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> pca = PCA(n_components=2)
>>> pca.fit(X)
PCA(copy=True, iterated_power='auto', n_components=2, random_state=None,
svd_solver='auto', tol=0.0, whiten=False)
>>> print(pca.explained_variance_ratio_)
[ 0.99244... 0.00755...]
字典数据提取
def dictvec(): """ 字典数据抽取 :return: None """ # 实例化 # sparse改为True,输出的是每个不为零位置的坐标,稀疏矩阵可以节省存储空间 dict = DictVectorizer(sparse=False) # 把sparse改为True看看 # 调用fit_transform data = dict.fit_transform([{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]) print(data) print('-' * 50) print(dict.get_feature_names()) # 字典中的一些类别数据,分别进行转换成特征 print('-' * 50) print(dict.inverse_transform(data)) return None dictvec()
运行结果
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
--------------------------------------------------
['city=上海', 'city=北京', 'city=深圳', 'temperature']
--------------------------------------------------
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
文本数据
def couvec(): # 实例化CountVectorizer vector = CountVectorizer(max_df=2) # 调用fit_transform输入并转换数据 res = vector.fit_transform( ["life is short,i like python", "life is too long,i dislike python", "life is short"]) # 打印结果,把每个词都分离了 print(vector.get_feature_names()) print(res) # 对照feature_names,标记每个词出现的次数 print(res.toarray()) couvec()
运行结果
['dislike', 'like', 'long', 'python', 'short', 'too']
(0, 4) 1
(0, 1) 1
(0, 3) 1
(1, 3) 1
(1, 5) 1
(1, 2) 1
(1, 0) 1
(2, 4) 1
[[0 1 0 1 1 0]
[1 0 1 1 0 1]
[0 0 0 0 1 0]]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。