机器学习在生活中无处不在,你是否会疑问为什么你的某宝界面总是给你推荐一些商品,而这些商品还是你自己想要的东西,这就是电商平台利用大数据推荐算法,结合你的历史搜索记录和浏览记录,以及你的购买记录作为数据支撑,最终推荐给你心仪的商品。
某音视频也是如此,为什么每个人的视频刷的都不一样,小朋友的界面;年级人的界面;老年人的界面大不相同,那是因为会根据你的历史观看记录和关注人群做层次筛选,这样结合你的视频停留时间和用户发生的动作行为作为数据支撑,最终演化为一个符合人性化的推荐算法!
每一次当你使用微信朋友圈,微博的相片分类功能,它能识别出哪些是你好友的照片,这也是机器学习算法。
每次当你使用百度搜索引擎时,它能给出如此满意的结果,原因之一就是使用了机器学习算法。
机器学习还可以实现图像的像素增强以及图像补全,同时还可以在图像识别方面具有较好的可塑性和重用性。
简单来说,机器学习就是让计算机从大量的数据中学习到相关的规律和逻辑,然后利用学习来的规律来预测以后的未知事物
如果要说到机器学习,不得不推荐一个Python的库:sklearn,它具有大量的模型算法,而且都已经封装好了,只需要我们自己去调用即可,就像科研神器R语言一样,拥有大量的宏包,Python也是如此。
官方指导手册网址
scikit-learn: machine learning in Python — scikit-learn 1.0.2 documentation
train_x, train_y, test_x, test_y = getData() model1 = somemodel() model.fit(train_x,train_y) predictions = model.predict(test_x) score =score_function(test_y, predictions) joblib.dump(knn, 'filename.pkl')
机器学习的步骤
机器学习初步可以分
机器学习初步可以分为:
数据导入,特征选取,数据分割,模型选择,模型训练,模型评分,模型调优
什么是特征选取呢?
什么又是特征工程?
这里只是简单的提一下,后续将会详细的介绍,特征工程就是将机器无法识别,无法运算的数据转换为数值类型的数据,用于模型的训练和测试。
利用sklearn中分割函数train_test_split()函数去将数据分割为测试集和训练集
train_test_split函数的详解
在机器学习中,我们通常将原始数据按照比例分割为“测试集”和“训练集”
从 sklearn.model_selection 中调用train_test_split 函数
简单用法如下:
X_train,X_test, y_train, y_test =sklearn.model_selection.train_test_split (train_data,train_target,test_size=0.4, random_state=0,stratify=y_train)
train_data:所要划分的样本特征集
train_target:所要划分的样本结果
test_size:样本占比,如果是整数的话就是样本的数量
random_state:是随机数的种子
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
stratify:是为了保持split前类的分布。比如有100个数据,80个属于A类,20个属于B类。
如果train_test_split(... test_size=0.25, stratify = y_all), 那么split之后数据如下:
training: 75个数据,其中60个属于A类,15个属于B类
testing: 25个数据,其中20个属于A类,5个属于B类。
用了stratify参数,training集和testing集的类的比例是 A:B= 4:1
等同于split前的比例(80:20)。通常在这种类分布不平衡的情况下会用到stratify。
将stratify=X就是按照X中的比例分配
将stratify=y就是按照y中的比例分配
整体总结起来各个参数的设置及其类型如下:
主要参数说明:
*arrays 可以是列表、numpy数组、scipy稀疏矩阵或pandas的数据框
test_size:可以为浮点、整数或None,默认为None
①若为浮点时,表示测试集占总样本的百分比
②若为整数时,表示测试样本样本数
③若为None时,test size自动设置成0.25
train_size:可以为浮点、整数或None,默认为None
①若为浮点时,表示训练集占总样本的百分比
②若为整数时,表示训练样本的样本数
③若为None时,train_size自动被设置成0.75
random_state:可以为整数、RandomState实例或None,默认为None
①若为None时,每次生成的数据都是随机,可能不一样
②若为整数时,每次生成的数据都相同
stratify:可以为类似数组或None
①若为None时,划分出来的测试集或训练集中,其类标签的比例也是随机的
②若不为None时,划分出来的测试集或训练集中,其类标签的比例同输入的数组中类标签的比例相同,可以用于处理不均衡的数据集
总之在遇到数据集不平衡的情况下可以使用该参数,来调节数据标签的不平衡的情况,我们可以该参数调节
机器学习评估指标
分类模型评估指标
分类常用指标:
准确率( accuracy):对于给定的测试数据集,分类器正确分类的样本数与总样本数之比
混淆矩阵
针对预测值和真实值之间的关系,我们可以将样本分为四个部分:
真正例(True Positive,TP):预测值和真实值都为1
假正例(False Positive,FP):预测值为1,真实值为0
真负例(True Negative,TN):预测值与真实值都为0
假负例(False Negative,FN):预测值为0,真实值为1
很明显的得知,真正例和真负例越多,说明模型的效果就越好
ROC曲线
那么有了混淆矩阵,这样一个规则之后,我们需要一个评估指标可以直接的反映该情况的好坏,此时就引入了:
真正例率
上述公式,如果值越大那么说明真正例越多
假正例率
TPR也就是我们所说的召回率,通过TPR和FPR的相关性图,可以得到ROC曲线,如下图所示:
图中的红色曲线和蓝色曲线分别表示了两个不同的分类器的TPR-FPR曲线,曲线上的任意一点都对应了一个特定的数值,也就是说如何看ROC曲线,从它的构造本质来看,真正例越大,假正例就越少,也就是说我们画出该曲线的时候,应该如何去看,怎样的曲线效果才是最好的,请看下面的解说:
曲线越是“凸”向左上角,说明分类器效果越好
最完美的分类器(完全区分正负样例):(0,1)点,即没有FP,全是TP ,根本不存在,如果存在应该思考是否出现错误?
随机预测会得到(0,0)和(1,1)的直线上的一个点
曲线上离(0,1)越近的点分类效果越好,对应着越合理的
如此来看,上面的ROC曲线,红色的较好与蓝色的
利用ROC的其他评估标准
AUC:是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,而作为一个数值,对应AUC更大的分类器效果更好;
这里需要注意的是,ROC曲线和AUC面积一般用于分类中的二分类情况,ROC曲线用在多分类中是没有意义的。只有在二分类中Positive和Negative同等重要时候,适合用ROC曲线评价。如果确实需要在多分类问题中用ROC曲线的话,可以转化为多个“一对多”的问题。即把其中一个当作正例,其余当作负例来看待,画出多个ROC曲线。
EER:也就是FPR=FNR的值,由于FPR=1-TPR,可以画一条从(0,1)到(1,0)的直线,找到交点,图中的A、B两点。
如果roc曲线绘制出来是一个对角线,那么就属于随机猜测模型,意义不大
ROC曲线的意义及解释
ROC曲线能很容易的查出任意阈值对学习器的泛化性能影响。
有助于选择最佳的阈值。ROC曲线越靠近左上角,模型的查全率就越高。最靠近左上角的ROC曲线上的点是分类错误最少的最好阈值,其假正例和假反例总数最少。
可以对不同的学习器比较性能。将各个学习器的ROC曲线绘制到同一坐标中,直观地鉴别优劣,靠近左上角的ROC曲所代表的学习器准确性最高。
该方法简单、直观、通过图示可观察分析方法的准确性,并可用肉眼作出判断。ROC曲线将真正例率和假正例率以图示方法结合在一起,可准确反映某种学习器真正例率和假正例率的关系,是检测准确性的综合代表。
此外,可以把多个模型(二分类)的ROC曲线绘制在一个平面图中,至于如何比较这个时候,就需要用到AUC面积了,面积越大说明该模型或者该算法下的分类效果较好