前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习-从高频号码中预测出快递送餐与广告骚扰

机器学习-从高频号码中预测出快递送餐与广告骚扰

作者头像
企鹅号小编
发布2018-01-16 10:11:06
6490
发布2018-01-16 10:11:06
举报
文章被收录于专栏:人工智能

由头

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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档