由头
1、笔者最近在做机器学习嘛,上次发了一篇文章,这周发现有大问题,此次算是对上篇的补充与说明。
2、算法基本完成,在进行收尾的工作,今天共享给大家思路,涉及到具体的东西,应该就会隐藏。
3、昨天在聊申请专利的事,按照正常逻辑,此算法出来后,会被公司用于申请专利,虽然署名是我,但是心里多少不爽。本着服务大众的心态,共享一下步骤,希望大伙一起进步。
内容
1、首先卖个蠢萌的问题,机器学习啥子最重要?
人最重要,钱最重要!!!!不信你试试不给我钱,看我做不做。
所以,请记住笔者的话,做监督学习,需要:
大量的、精确的、有标签的数据。
大量的、精确的、有标签的数据。
大量的、精确的、有标签的数据。
重要的事情说三遍啦~~~~~~
2、有了数据的笔者改干嘛?
2.1、数据清洗。
所谓的数据清洗,就是给数据“洗澡”。
当我们拿到一份数据后,基本上都是阿拉伯数字,1,2,3,4,5.。。。。很happy的集合在一起,像下面一样,我现实中的数据,意
不意外,惊不惊喜。
但是我们要来怎么清洗这些数据?重点的来啦,就是根据你的业务来,以下我会说明每一步的作用。
第一:无效列的删除
A:我的数据中有三列里面的内容非常少,几万行的数据那几列才存在不到1000个数据,果断删除
B:我的数据中存在一堆“是”跟“否”,由于我这些是否是从前面的那些阿拉伯叔叔们推断出来,我这里的做法是直接删除
第二:空值处理
A:这份数据存在很多空值,网上的做法一般都是填充0、均值、中值等,由于行业的特殊性,我这里全部都填充0进行处理,谁叫这是电话记录呢
第三:归一化处理
由于我的某一维度的值过大,导致对分类结果影响非常大,此处我用了归一化处理,转化为“单位向量”,采用的是规则为l2归一化
fromsklearn.preprocessingimportNormalizer
#归一化,返回值为归一化后的数据
Normalizer().fit_transform(iris.data)
2.2、数据体征提取。
当数据预处理完成后,我们需选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:
A:特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的
区分并没有什么用。
B:特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关
性考虑。
根据特征选择的形式又可以将特征选择方法分为3种:
A:Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
B:Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
C:Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特
征。类似于Filter方法,但是是通过训练来确定特征的优劣。
实际工作中要根据实际情况来选择最合适的特征提取算法,目前我只选择两种来做
第一:卡方检验
卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等 于j的样本频数的观察值与期望的差距,构建统计量
这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的SelectKBest类结合卡方检验来选择特征的 代码如下
fromsklearn.feature_selectionimportSelectKBest2
fromsklearn.feature_selectionimportchi2
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform("矩阵的行", "矩阵的列")
第二:递归特征消除
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训 练。使用feature_selection库的RFE类来选择特征的代码如下:
fromsklearn.feature_selectionimportRFE
fromsklearn.linear_modelimportLogisticRegression
#递归特征消除法,返回特征选择后的数据
#参数estimator为基模型
#参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform("矩阵的行", "矩阵的列")
第三:基于树模型的特征选择
树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择 特征的代码如下:
fromsklearn.feature_selectionimportSelectFromModel2
fromsklearn.ensembleimportGradientBoostingClassifier34
#GBDT作为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform("矩阵的行", "矩阵的列")
第四:线性判断分析
使用lda库的LDA类选择特征的代码如下:
fromsklearn.ldaimportLDA
#线性判别分析法,返回降维后的数据
#参数n_components为降维后的维数
LDA(n_components=2).fit_transform("矩阵的行", "矩阵的列")
2.2、开始分类
第一:按比例训练与测试样本划分
刚开始的时候只有一份有标签的数据,作为训练样本的同时,也要作为测试样本,如果采用我上篇文章的方式,会造成过拟 合的现象,采用了按照比例划分训练样本与测试样本,代码如下:
fromsklearn.cross_validationimporttrain_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
X_train:训练样本数据,用于做数据训练
X_test:测试样本数据,用于做测试的
y_train:训练样本的结果
y_test:测试样本的结果
第二:K折交叉验证
将全部训练集S分成k个不相交的子集,假设S中的训练样例个数为m,那么每一个自己有m/k个训练样例,相应的子集为
每次从分好的子集里面,拿出一个作为测试集,其他k-1个作为训练集
在k-1个训练集上训练出学习器模型
把这个模型放到测试集上,得到分类率的平均值,作为该模型或者假设函数的真实分类率
代码实现如下:
importnumpy as np
from sklearn.model_selectionimportKFoldkf=KFold(n_splits=2)#分成几个组
kf.get_n_splits("矩阵的行数据")
print(kf)
for train_index,test_indexin kf.split("矩阵的行数据"):
print("Train Index:",train_index,",Test Index:",test_index)
X_train,X_test=X[train_index],X[test_index]
y_train,y_test=y[train_index],y[test_index]
#print(X_train,X_test,y_train,y_test)
备注:目前只看情况做了这两个划分,还有GroupKFold、StratifiedKFold等,可自行百度
第三:随机森林
随机森林我不想说太多,因为随机森林太过于普遍,基本上很多人在刚开始的时候都会选中它,因为它容易理解,不抽象,就是一颗颗决策树构成的森林,然后做分类,类似于我们的二叉树,我直接就上代码:
fromsklearn.ensembleimportRandomForestRegressor
rf=RandomForestRegressor()#这里使用了默认的参数设置
rf.fit("划分好的训练样本","划分好的训练结果")#进行模型的训练
训练完数据,我们就可以开始进行数据预测,其中随机森林的参数需要自行根据样本调试,这里采用默认参数,但是看官一定需 要自己去调试自己的参数。
第四:KNN分类
所谓KNN,也叫K-近邻,确定测试样本属于哪一类,就寻找所有训练样本中与该测试样本“距离”最近的前K个样本,然后看这K 个样本大部分属于哪一类,那么就认为这个测试样本也属于哪一类。简单的说就是让最相似的K个样本来投票决定。代码如下:
fromsklearnimportneighbors
cal = neighbors.KNeighborsClassifier(algorithm='kd_tree')
clf.fit("划分好的训练样本","划分好的训练结果")
此时样本训练完成,可以进行数据预测,目前实际中笔者是做了for循环进行K值的选中,根据样本选取最优的K值,同时参数还是需要自己去调试。
总结
1:很多人问我机器学习怎么学?其实说实在话我也不是很清楚,但是有一点我觉得很重要,数学学好,本科跟研究生的数学,这里推荐数学之美可以去看,我们要做一个知其然而知其所以然的人,不做纸老虎。
2:目前这些步骤是我现实工作中实践过的,准确率稳定在90%左右,参数调整好了差不多93%,如果太高就需要考虑过拟合的情况。
3:这些步骤还有一些不完善之处,笔者也会积极改进跟优化这套算法,sklearn基本集成了很多算法,可以使用。
本文来自企鹅号 - 全球大搜罗媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - 全球大搜罗媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。