使用sk-learn解决二分类问题
sk-learn是一个python的机器学习工具库,最早基于scipy发展而来,可以与pandas、matplotlib、numpy等库无缝结合。本文主要介绍上手用sk-learn做二分类预测的方法和一些使用过程中的心得。按机器学习的步骤,我把文章分为三个部分:数据集准备、模型训练、模型检验。
数据集准备
数据来源
首先要明确我们要解决的是什么问题,输入输出分别是什么。标注数据可以来源于生产环境中的真实数据,也可以在网上下载的一些数据,比较常见的有iris,mnist,还有一些竞赛数据,处于学习目的都可以拉下来用。为了简单,我们假设数据随机生成,每个数据有两个feature(两维),用n行2列的数组表示。
这里要插一句:sk-learn的输入支持多种格式,无论是数组还是np.arrays都可以
1 2 |
x = np.random.rand(100,2) # 生成100组数据,每组数据2个feature (称为fa, fb) y = np.array([[int(tk[0]>tk[1])] for tk in x]) # 输出: fa是否大于fb = =|| |
数据组成
二分类问题中正负样本的比例是一个仁者见仁智者见智的问题,通常来说使正负样本数相同、或与真实数据比例保持一致就可以。但是如果某一方数据较少,或者特征较弱,则可以适当增加比例。
但是如果某一方数据极少,则是另一个问题了(class imbalance),可以通过采样方法平衡,甚至通过一些半监督方法去搞 (出门右转搜索TSVM或者一些generate model,我暂时还不会)
标准化和归一化
标准化是一种将所有数据无量纲化,映射到相同的区间内。通常方法是将原数值减去平均值后除以标准差。标准化后的数据都聚集在0附近,方差为1(z-score)。sk-learn提供了标准化函数:
1 2 |
from sklearn import preprocessing x_scaled = preprocessing.scale(x) # z-score |
归一化作用是将数值映射到[0,1]区间内,公式是 归一值=(原值-min)/(max-min) 。sk-learn也提供了归一化函数:
1 |
x_normalized = preprocessing.normalize(x) # min-max |
通常需要进行梯度优化的机器学习算法需要标准化和归一化,如LR、nn等,决策树之类的不用做(是基于信息增益的)。
shuffle以及训练集、测试集划分
shuffle是指打乱数据的原有顺序,不多说了。
为了验证模型效果,通常会使用70~80%的数据用来训练模型,剩下的数据用于验证原有模型,这样可以了解模型的泛化能力。当然也可以使用k-fold等方法做多轮交叉验证。
下面这个函数提供了shuffle和切分的功能:
1 2 |
from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # test_size指测试集占总数据的比例 |
模型训练
在数据准备阶段我们已经得到了x_train, x_test, y_train, t_test,接下来这部分我们需要用x_train和y_train来训练我们的模型。
sk-learn提供了很多种易(bu)于(yong)上(can)手(shu)的机器学习类可以使用,这些类都实现了fit()、predict()等方法,用起来非常简单,也非常容易构建多种不同方法的机器学习模型和混合模型。