创建分类器
简介
分类器是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是利用代表及的训练数据建立
一个模型,然后对未知数据进行分类
建立简单的分类器
代码参考learn1
建立逻辑回归分类器
给定一组数据点,需要建立一个可以在类之间绘制线性边界的模型
逻辑回归就可以对训练数据派生一组方程进行求解来提取边界
代码参考learn2
建立朴素贝叶斯分类器
朴素贝叶斯分类器是贝叶斯分定理进行建模的监督学期分类器
参考learn3
特征归一化
在机器学习过程中,各个特征的大小范围不一致,所谓 特征归一化 就是将不同类型的特征数值大小
变为一致的过程
例子:
归一化前:
-------------------------------------
样本 特征1 特征2
1 10001 2
2 16020 4
3 12008 6
4 13131 8
-------------------------------------
归一化后:
-------------------------------------
样本 特征1 特征2
1 0 0
2 1 0.33
3 0.73 0.67
4 0.81 1
-------------------------------------
特征归一化意义:
各特征之间的大小范围一致,才能使用距离度量等算法
加速梯度下降算法的收敛
在SVM算法中,一致化的特征能加速寻找支持向量的时间
不同的机器学习算法,能接受的输入数值范围不一样
两种常用方法:
sklearn库中MinMaxScaler和StandardScaler
使用:
---------------------------------------------------
from sklearn.preprocessing import MinMaxScaler
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
min_max_scaler = MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(x)#归一化后的结果
X_train_minmax
array([[ 0. , 0. ],
[ 1. , 0.33333333],
[ 0.33344409, 0.66666667],
[ 0.52001994, 1. ]])
注:它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围
是可调的(根据MinMaxScaler的参数feature_range调整)
---------------------------------------------------
---------------------------------------------------
from sklearn.preprocessing import StandardScaler
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
X_scaler = StandardScaler()
X_train = X_scaler.fit_transform(x)
X_train
array([[-1.2817325 , -1.34164079],
[ 1.48440157, -0.4472136 ],
[-0.35938143, 0.4472136 ],
[ 0.15671236, 1.34164079]])
注:归一化后,矩阵每列的均值为0,标准差为1
---------------------------------------------------
Sklearn常用分类器
----------------------------------------------------
KNN Classifier
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier()
clf.fit(train_x, train_y)
先对训练数据进行分类,再对新输入的数据找到对应的类划分其中(类似少数服从多数的思想)
算法概括:有A,B两类,以输入数据为圆心,以k为半径画圆,在圆内A,B那个的数量多则输入属于
该类。
参数选择:李航波士《统计学习与方法》的书上讲到,我们一般选取一个较小的数,通常采用交叉验证来选取最优值
-----------------------------------------------------
Logistic Regression Classifier (逻辑回归分类器)
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(penalty='l2')
clf.fit(train_x, train_y)
在分类的情况下,经过学习后的LR分类器实际上就是一组权重w0, w1, ...
当输入测试样本时,这组权重按照测试数据线性加和的方式,求出一个z:
z = w0+w1*x1+w2*x2+...+wm*xm
LR分类器最关键的问题就是求出一组权重,这涉及到极大似然估计和优化算法
应用场景:
1.二分类观察结果
2.一些影响因素之间的关系的一种多变量分析法
3.某些因素条件下某个结果是否发生
解决过拟合的方法:
1.增加数据量(万能办法)
2.减少特征:手动剔除;特征选择算法
3.正则化:结构风险最小化策略
4.数据稀疏:L1正则化
5.其他情况:L2正则化
-----------------------------------------------------
Random Forest Classifier (随机森林分类器)
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=8)
clf.fit(train_x, train_y)
随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本
单元是决策树,它的本质属于机器学习的一大分支----集成学习方法
直观解释,每棵决策树都是一个分类器,那么对于一个输入样本,N棵树就有
N个分类结果。而随机森林就是集成了所有分类投票的结果,将次数最高的类别别
最终作为输出。
随机森林的特点:
1.在当前所有算法中,具有极好的准确性
2.能够有效地运行在大数据集上
3.能够处理具有高维特征的输入样本,而且不需要降维
4.能够评估各个特征在分类问题上的重要性
5.在生成过程中,能够获取到内部生成误差的一种无偏估计
---------------------------------------------------
Decision Tree Classifier(决策树分类器)
from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf.fit(train_x, train_y)
决策树是一种无参监督学习方法,其目的是创建一种模型从数据特征中学习简单的决策规则
来预测一个目标变量的值。它可用于分类也可以用于回归。
优点:
便于理解,可以可视化,分类速度快,需要数据量少,既可以处理连续属性也可以处理离散属性
缺点:
模型可能会复杂,从而过拟合,单个决策树可能不稳定,可以通过集成学习缓解。
判断在某节点上的分类质量:
分类:基尼指数,交叉熵,错误分类率
回归:均方误差,平均绝对误差
--------------------------------------------------
GBDT(Gradient Boosting Decision Tree) Classifier(GBDT(梯度增强决策树)分类器)
from sklearn.ensemble import GradientBoostingClassifier
clf = GradientBoostingClassifier(n_estimators=200)
clf.fit(train_x, train_y)
GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive
Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的
结论累加起来做最终答案。它在被提出之初就和SVM一起被认为是泛化能力较强的算法。
--------------------------------------------------
AdaBoost Classifier(演算法分类器)
from sklearn.ensemble import AdaBoostClassifier
clf = AdaBoostClassifier()
clf.fit(train_x, train_y)
Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),
然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)Adaboost算法本身是通
过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类
的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每
次得到的分类器最后融合起来,作为最后的决策分类器。
算法概述:
1、先通过对N个训练样本的学习得到第一个弱分类器;
2、将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器;
3、将1和2都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器
4、最终经过提升的强分类器。即某个数据被分为哪一类要由各分类器权值决定。
-------------------------------------------------
GaussianNB
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(train_x, train_y)
朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,
KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X
之间的关系,要么是决策函数Y=f(X),要么是条件分布P(Y|X)。但是朴素贝叶斯却是生成方
法,也就是直接找出特征输出Y和特征X的联合分布P(X,Y),然后用P(Y|X)=P(X,Y)/P(X)得出。
朴素贝叶斯很直观,计算量也不大
使用:大部分数据是连续值
优点:
1.朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
2.对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超
出内存时,我们可以一批批的去增量训练。
3.对缺失数据不太敏感,算法也比较简单,常用于文本分类。
缺点:
1.在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,
朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
2.对输入数据的表达形式很敏感
------------------------------------------------
Linear Discriminant Analysis(线性判别分析)
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
clf = LinearDiscriminantAnalysis()
clf.fit(train_x, train_y)
给定一组训练样本,设法将样本投影到某一条直线上,使相同分类的点尽可能地接近而不同分类
的点尽可能地远,因此可以利用样本点在该投影直线上的投影位置来确定样本类型
-----------------------------------------------
Quadratic Discriminant Analysis(二次判别分析)
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
clf = QuadraticDiscriminantAnalysis()
clf.fit(train_x, train_y)
-----------------------------------------------
SVM Classifier
from sklearn.svm import SVC
clf = SVC(kernel='rbf', probability=True)
clf.fit(train_x, train_y)
-----------------------------------------------
Multinomial Naive Bayes Classifier (多项朴素贝叶斯分类器)
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB(alpha=0.01)
clf.fit(train_x, train_y)
-----------------------------------------------
剪枝参数
为了让决策树有更好的泛化性,需要对决策树进行剪枝。剪枝策略对决策树的
影响巨大,正确的剪枝策略是优化决策树的算法核心
max_depth:
限制树的最大深度,超过设定深度的树枝全部剪掉,使用时一般从3开始尝试
min_samples_leaf和min_samples_split:
用来限制一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf各训练样本,
否则分枝就不会发生
max_features 和 min_impurity_decrease:
max_features限制分枝时考虑树的特征个数,超过的会被遗弃
min_impurity_decrease限制信息增益大小
机器学习调参基本思想
1.找准目标
2.泛化误差
需要代码可以私信博主