机器学习库Scikit-learn 介绍
Scikit-learn 是开源的 Python 库,通过统一的界面实现机器学习、预处理、交叉验证及可视化算法。
Python 中的机器学习
简单有效的数据挖掘和数据分析工具
可供所有人访问,并可在各种环境中重复使用
基于 NumPy,SciPy 和 matplotlib 构建
开源,商业上可用 - BSD 许可证
几个重要概念
(1)分类 确定对象属于哪个类别。
应用:垃圾邮件检测,图像识别。 算法: SVM,最近邻居,随机森林,......
(2)回归
预测与对象关联的连续值属性。
应用:药物反应,股票价格。 算法: SVR,岭回归,套索,......
(3)聚类 将类似对象自动分组到集合中。
应用:客户细分,分组实验结果 算法: k-Means,谱聚类,均值漂移,......
(4)降维 减少要考虑的随机变量的数量。
应用:可视化,提高效率 算法: PCA,特征选择,非负矩阵分解。
(5)模型选择 比较,验证和选择参数和模型。
目标:通过参数调整提高准确性 模块: 网格搜索,交叉验证,指标。
(6)预处理 特征提取和规范化。
(7) 应用程序: 转换输入数据(如文本)以与机器学习算法一起使用。
(8) 模块: 预处理,特征提取。
#py601.py Scikit-learn 机器学习步骤 示例
# 导入 sklearn
from sklearn import neighbors, datasets, preprocessing
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
print('=========== 机器学习步骤 示例 =========')
# 加载数据
print('------加载数据-----------')
iris = datasets.load_iris()
print(iris)
# 划分训练集与测试集
print('-----划分训练集与测试集-------------')
X, y = iris.data[:, :2], iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33)
print(X,y)
print(X_train, X_test, y_train, y_test)
# 数据预处理
print('-----数据预处理-------------')
scaler = preprocessing.StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
print(scaler)
print(X_train)
print(X_test)
# 创建模型
print('----- 创建模型-------------')
knn = neighbors.KNeighborsClassifier(n_neighbors=5)
print(knn)
# 模型拟合
print('----模型拟合--------------')
knn.fit(X_train, y_train)
print(knn.fit)
# 预测
print('-----预测-------------')
y_pred = knn.predict(X_test)
print(y_pred)
# 评估
print('------评估------------')
accuracy_score(y_test, y_pred)
print(accuracy_score(y_test, y_pred))
(一)数据准备
数据准备阶段包含从原始数据到形成最终数据集(将要被喂给模型工具的数据)的所有操作。数据准备任务可能要进行多次,没有规定的固定顺序。任务包括:表,记录和特征选择以及为了模型工具的数据清洗和转换。
--数据准备是费时间的
纽约时报的一篇文章报道,数据科学家在挖掘出有价值的“金块”之前要花费50%到80%的时间在很多诸如收集数据和准备不规则的数据的普通任务上。混乱的数据是数据科学家工作流中典型的比较耗费时间的。
--真实世界中数据是杂乱的
数据很少是干净的而且经常有数据质量问题。比如:数据的不唯一性,格式上不统一,非法值,特征依赖,缺失值,错误拼写,等等。。见下图:
典型的数据质量问题有几个原因:
不完全性:数据缺少特征或者包含缺失值
噪声:数据包含错误的记录或者异常值
不一致性:数据包好冲突的记录或者差异。
哪种问题影响数据质量?
非法值:一些数据集包含一些明显的值:例如性别只能是男或女,上面的例子很容易发现错误。
格式:最常见的问题。可能获得不同格式的值比如名字写成:“姓名,xxx”或者“xxx姓名”
特征依赖:一个特征的值依赖于另一个特征。例如:如果我们有一些学校数据,学生的数量与这个人是否是教师有关。如果某个人不是教师,他不可能有一些学生。
唯一性:很可能发现只允许唯一值得数据重复。例如:我们的两个产品不能有两个身份ID。
缺失值:数据集的一些特征的值可能是空白或者缺失的。
拼写错误:顾名思义。
错位值:一个特征的值包含另一个特征。
-数据准备:避免垃圾进,垃圾出
--清洗你的数据
为什么处理缺失值?
数据集的缺失值可能导致错误或者由于没有记录的观察值。
如果缺失值出现,确定的算法可能就无效了或者得不到你期望的结果。
缺失值比其他值更能影响模型。
尽管有些模型可以处理缺失值,但是对缺失值比较敏感(某一变量的缺失可能得到不好的预测结果)。
如何处理缺失值?
处理缺失值的经典方法有:
删除:删除含有缺失值的记录。
虚拟替换:利用虚拟值替换缺失值。例如:不知道的类别或者数值0.
均值替换:如果缺失值是数值型的,利用均值替换。
频数替换:如果缺失值是类别的,利用出现最多的项替换。
回归替换:利用回归方法得到回归值替换缺失值。
关于异常/离群点你需要知道的?
异常值可能通过扭曲预测模型而带来问题。
离群点多少有点主观。
在多维数据中异常值非常常见。
一些模型相对于其他数据对异常值没那么敏感。
异常值可能是差的数据集的结果或者他们可以使得极值(或不寻常)变得合理。
一些异常值是我们训练模型有兴趣的点,但有时候他们只是挡住我们训练的脚步。
离群点的成因
如何处理离群点
具体如何处理离群点应该视情况而定。
保持离群点:一些数据中可能是真实值得离群点没有必要必须从数据中移除。在一些应用中,离群点会提供一些决定性的信息。比如:在一个信用卡欺诈检测的APP里,他们可以提供陷入消费者习惯购买模式之外。
移除离群点:有两种方法移除离群点
A:修改或者截断
B:替换
处理离群点的例子:
截断或者修改
替换
截断或修改小于5%的数据点不会对假设结果产生太大的影响。
大于5%的数据点可能影响输出结果比如:
削弱分析的力度
使样本缺少代表性
可能影响正常数据
考虑到数据转换,选择一个可替代的结果变量或者数据分析技术。
--数据归一化
如何归一化数据?
数据归一化就是将数值型的值转换到一个特定的区间上。常用的归一化方法包含如下几种:
Min-Max归一化
线性的将值转换到一个0-1的区间。最小值0,最大值1.公式:
Z-score归一化(标准归一化)
根据数据的均值和方差归一化:利用数据平均值的差除以数据的方差。特征标准化使得数据具有0均值(即当减去分子中的均值是)和标准方差。公式:
Decimal归一化
将数据中带有小数点的特征值去掉小数点。
注:数据集的不同度量尺度可能是有问题的,在一些特定的机器学习算法是要求数据具有相同的比例的。
--数据离散化
如何离散化数据?
数值变量可能有许多不同的值,对于某些算法,这可能导致非常复杂的模型。可以通过“绑定”将连续属性转换为分类属性,以便于使用某些机器学习方法。离散化是将数据放进一些桶的过程,所以这是有限个可能的状态。这些桶本身被视为有序和离散的。你也可以离散化数值列和字符串列。
Bining(装箱):
装箱有助于提高模型的效果。他能捕获连续变量的非线性行为。
他最小化离群值的影响。他从大量的去重数据中移除噪声数据。
他使得模型更具解释性-分组数据更容易展示和理解。他也能提高模型的速度-当去重数据减少时能更快的建立模型。
可以通过将连续数值转换为分类属性或者间隔值离散化数据。如下有一些方法:
--数据降维
样本数据:
如果你要分析的数据非常庞大,通常比较好用的减少数据量的方法是将数据减少维度而且使得数据变得更加具有代表性和容易处理。这将促进数据的理解,探索和特征工程。大量的数据会导致算法更长的运行时间和更大的计算和内存需求。在总的数据训练之前你可以拿一些具有代表性的少量数据去训练,这样可能会更快的探索和验证方案。
如何给数据降维?有很多将数据降维的方法,以使得数据更容易处理。依赖于数据的大小和主要特征,如下有一种降维方法可以应用:
记录取样:只从数据样本中取出具有代表性的数据。
特征取样:只选择比较重要的几个特征。
聚合:将数据分为几组并记录每组数据的条数。例如:可以将过去20年连锁餐厅的每日收入聚合为月收入以减少数据量。
--文本清洗
如何清洗文本数据?
在读取/写入文本时不适当的文本编码处理会导致信息的丢失,不经意的引入不可读的字符(如:null)也可能影响文本解析。一些非结构化的文本如推特,生产评论或者网页访问数据在被分析之前通常需要做一些准备工作。
例如:
利用空格替换特殊字符和标点符号
规范化案例
移除重复的字符
移除用户自定义的或者内置的停用词
词干提取
案例视频网址:https://azure.microsoft.com/en-us/resources/videos/preprocessing-data-in-azure-ml-studio/
--特征工程
特征工程在机器学习中是关键的任务。现在没有对特征工程统一的定义,对于不同的人他意味着不同的事情。在谷歌的定义里:从数据中提取特征的过程叫做特征工程。在微软的文档里特征工程更多的是关于特征的构造。
特征工程是一门艺术-数据专家和专业领域专家交流越多,特征工程过程会越好。
特征工程师需要在数据探索步骤里结合专业领域知识和洞察力。
为了避免不相关的变量找到包含详实的变量是一个平衡的艺术。
详实的变量可以提升结果;不相关的变量会给模型增加不必要的噪声。
什么是特征?
左边三列是输入特征又叫做属性,解释变量,自变量右边一列是对应的结果又叫做因变量,最后一列最下面两个问号是未知值,是要利用模型进行预测的。
特征就是一个可以独立测量的属性或者根据现象可观察的值。在上面图中的例子,有一系列特征如bedrooms,house size,neighborhood用来当做模型的输入,目标就是房子的售价。图中有一些知道价格的房子(分为训练集和测试集)。一个模型可以被建立用于预测还不知道价格的房子。简而言之就是一旦我们利用带有标签的样本训练我们的模型,我们就可以用它预测没有标签样本的标签。
--特征工程可以增强你的数据
--特征工程案例
案例一:
案例2
案例3
案例4
因为我们的目标是从训练数据里构造更加高效的特征,我们用同一个算法但用四个不同的训练数据集建立了四个模型。这四个训练数据集都是极具同样的输入数据创建的,只不过是为四个数据集增加了不同的特征。
特征集合A=天气+假期+工作日+周末作为预测日的特征
特征集合B=每天的前12小时的自行车租赁数量
特征集合C=在同一个小时的前12天的自行车租赁数量
特征集合D=在同一天的同一个小时的前12周的自行车租赁数量
除了特征集合A是在原始数据里都已经存在的特征,其他三个特征集合都是通过特征工程创建的。这些特征集合的每一个都体现不同刚面的问题:
特征集合B体现最近的租赁需求
特征集合C体现在一个特征小时内的租赁需求
特征集合D体现在一个特定小时和特定一周内的某一天的租赁需求
四中数据集的效果对比:
我们用了增强决策树回归模型,一个常用的非线性算法建立模型。为了理解四个模型的表现,上表给出了对比的结果。表中可以看出:最好的结果是A+B+C和A+B+C+D但是特征集合D并没有对模型的效果有所提升。
--特征选择
通过特征集合的部分特征来降低特征空间。特征选择就是从原始数据的特征集合里选择一个特征子集来降低特征的维度,以用最小的特征子集代表最大数量的变量。这个子集就是要进行模型训练的数据集。通常是先用特征工程生成特征然后在特征选择这一步更好的评估相关的,多于的和高度匹配的特征。
-为什么要进行特征性选择?
通常,数据包含很多冗余和不相关的特征,一下有四个进行特征选择技术的原因?
简化模型:使得研究者或者用户更易于解释
假话训练时间:提升学习过程
避免维度灾难
增加泛化能力:防止过拟合
维度灾难:
维数灾难指的是某些学习算法在高维数据中表现不佳。例如:经过一个固定点之后,通过增加特征来增加问题的维度确实会影响我们的分类器的性能。这种情况如下图所示,通常我们称之为“维灾难”。
当你增加更多特征时,你可能需要指数级的增加数据去填充一些空白。然而,实际上我们的数据量都是固定的,增加你需要的数据并不容易。
--特征选择方法
--传统的方法:
正向选择:刚开始模型没有变量,然后你迭代的添加变量并特使模型的预测精度,直到添加更多的变量不再对模型产生正面的影响。
反向消除:开始时使用全部变量,通过移除变量测试预测精度来选择特征。
逐步回归:这是一个通过不断的迭代步骤选择最好的特征删除最差的特征的算法。在每一个阶段的过程,添加一个新变量后,在没有明显增加误差的情况下进行测试检查是否能删除一些变量。当度量(局部)最大化时,或者当可用改进低于某个临界值时,该过程终止。
--过滤方法
通过评估每个特征和目标属性之间的相关性,这些方法通过应用一个统计测量给每一个特征附一个分数。特征根据分数进行排名,这个分数可以用来帮助设置一个阈值来选择或者消除一个特定的特征。统计的测量方法包括如下几种:
Pearson相关系数
互信息
卡方测试等等
这些方法在计算时间上特别有效,并且对过拟合具有鲁棒性。然而,过滤方法趋向于选择冗余的特征,因为他们不考虑变量之间的相关性。因此,他们主要用作一个预处理方法。
--包装方法
包装方法将选择特征作为一个搜索问题,和组合不同的是准备,评估以及和其他的组合比较。一个预测模型被用来评估一个组合特征并基于模型精度附一个得分。
包装器方法评估变量的子集,这与过滤方法不同,允许检测变量之间可能的交互。
当包装器方法为每个子集训练新的模型时,它们在计算上非常密集,但是通常为该特定类型的模型提供最佳性能的特征集。
--嵌入方法
嵌入的方法在创建模型的同时,学习哪些特征对模型的准确性做出最好的贡献。最常用的嵌入式特征选择方法是正则化方法。正则化方法也称为惩罚方法,它向预测算法(如回归算法)的优化引入额外的约束,使模型偏向于较低的复杂度(较少的系数)。这些方法的一些最流行的例子是LASSO和RIDGE回归,它们具有内置的惩罚函数以减少过拟合。
--特征选择方法总结
过滤方法使用统计方法评估特征子集,然而包装方法使用交叉验证。
过滤器方法比包装器方法快得多,因为它们不涉及对模型进行训练。另一方面,包装方法在计算上也非常昂贵。
在很多情况下,筛选方法可能无法找到最佳特性子集,但是包装器方法总是可以提供最佳特性子集
与使用来自过滤方法的特征子集相比,使用来自包装方法的特征子集使模型更容易过拟合
嵌入式方法结合过滤器和包装方法的性质。它是由具有自己的内置特征选择方法的算法实现的
--特征选择VS降维
--特征工程的定义具有不同的版本
谷歌的定义比微软包含更多的处理。在谷歌的定义中,特征工程包括数据预处理,数据过采样,特征选择等。让我们看看谷歌如何做特征工程:
特征工程是指将原始数据转换为特征向量。从原始数据创建特征的过程是特征工程,期望花费大量的时间做特征工程。