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

由头

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基本集成了很多算法,可以使用。

本文来自企鹅号 - 全球大搜罗媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SIGAI学习与实践平台

自然场景文本检测识别技术综述

番外 青蛇: 姐, 图像文本检测和识别领域现在的研究热点是什么? 白蛇: 白纸黑字的扫描文档识别技术已经很成熟,而自然场景图像文本识别的效果还不理想。倾斜字、艺...

2.5K2
来自专栏null的专栏

机器学习中的特征空间

声明:这篇博文主要是对参考文献中的那个PPT的学习之后记下的一些笔记,整理出来与大家一起分享,若笔记中有任何错误还请不吝指出,文中可能会使用到原作者的一些图,若...

4966
来自专栏AILearning

【机器学习实战】第7章 集成方法 ensemble method

第7章 集成方法 ensemble method ? 集成方法: ensemble method(元算法: meta algorithm) 概述 概念:...

2689
来自专栏机器之心

学界 | 谷歌云提出渐进式神经架构搜索:高效搜索高质量CNN结构

40812
来自专栏机器学习算法工程师

全面解读Group Normbalization-(吴育昕-何凯明 重磅之作)

一句话概括,GroupNormbalization(GN)是一种新的深度学习归一化方式,可以替代BN。

1794
来自专栏机器学习算法工程师

fine-gained image classification

我们在路边看到萌犬可爱至极,然后却不知道这个是哪种狗;看见路边的一个野花却不知道叫什么名字,吃着一种瓜,却不知道是甜瓜还是香瓜傻傻分不清……

1122
来自专栏机器之心

AAAI 2018 | 南京大学提出用于聚类的最优间隔分布机

3755
来自专栏生信小驿站

无监督学习 聚类分析③

可以看到有16个指标支持最佳聚类数目为3,5个指标支持聚类数为2,所以该方法推荐的最佳聚类数目为3.

934
来自专栏大数据挖掘DT机器学习

决策树原理与应用:C5.0

分类预测指通过向现有数据的学习,使模型具备对未来新数据的预测能力。对于分类预测有这样几个重要,一是此模型使用的方法是归纳和提炼,而不是演绎。非数据挖掘类的软件的...

4706
来自专栏数说工作室

造出一艘logistic模型 | 【logistic从生产到使用】(下) | 数说 · 算法

前几天飞扬博士更新了一篇算法文章,关于softmax regression的,它是logistic模型的扩展,因此要是能有些logistic regressio...

3203

扫码关注云+社区

领取腾讯云代金券