一. K-近邻算
工作原理
简洁的讲: 如果一个样本在特定的空间中的K个最邻近的中的大多数属于某个类,则这个样本属于这个类.
用途
k近邻的目的是测量不同特征值与数据集之间的距离来进行分类
样本差异性
欧式距离
优缺点
优点:精度高、对异常值不敏感、无数据输入假定。缺点:时间复杂度高、空间复杂度高。适用数据范围:数值型和标称型。
导包
- 分类问题:from sklearn.neighbors import KNeighborsClassifier 1. 回归问题:from sklearn.neighbors import KNeighborsRegressor
参数
- n_neighbors:取邻近点的个数k。k取1-9测试- weight:距离的权重;uniform:一致的权重;distance:距离的倒数作为权重- p:闵可斯基距离的p值; p=1:即欧式距离;p=2:即曼哈顿距离;p取1-6测试
二、线性回归
【关键词】最小二乘法,线性
原理
普通的线性回归
最小二乘法
平方误差可以写做:
对W求导,当导数为零时,平方误差最小,此时W等于:
导包
from sklearn.linear_model import LinearRegression
岭回归
岭回归是加了二阶正则项(lambda*I)的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小。
为了得到一致假设而使假设变得过度严格称为过拟合,
bias:指的是模型在样本上的输出与真实值的误差 variance:指的是每个模型的输出结果与所有模型平均值(期望)之间的误差
公式
导包
from sklearn.linear_model import Ridge
参数
alpha:调整为大于1的数字
优点
- 缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果 2. 岭回归是加了二阶正则项的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小。
归纳总结
- 岭回归可以解决特征数量比样本量多的问题1. 岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维的效果1. 缩减算法可以看作是对一个模型增加偏差的同时减少方差
岭回归用于处理下面两类问题:
- 数据点少于变量个数1. 变量间存在共线性(最小二乘回归得到的系数不稳定,方差很大)
lasso回归
原理
【拉格朗日乘数法】
对于参数w增加一个限定条件,能到达和岭回归一样的效果
在lambda足够小的时候,一些系数会因此被迫缩减到0
导包
from sklearn.linear_model import Lasso
参数:
alpha:调整为小于1的数字
三、逻辑斯蒂回归(分类)
【关键词】Logistics函数,最大似然估计,梯度下降法
Logistics回归的原理
利用Logistics回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。
预测函数
Cost函数
梯度下降法求J(θ)的最小值
训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化算法。接下来介绍这个二值型输出分类器的数学原理
Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:
- 找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果1. 构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式 。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。1. 显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值
参数
solver参数的选择:
- “liblinear”:小数量级的数据集- “lbfgs”, “sag” or “newton-cg”:大数量级的数据集以及多分类问题- “sag”:极大的数据集
优缺点
优点: 实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低
缺点: 容易欠拟合,分类精度可能不高
四、决策树
【关键词】树,信息增益
构造
信息论
不同于逻辑斯蒂回归和贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。
构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:
代码语言:javascript复制 1、属性是离散值且不要求生成二叉决策树。此时用属性的每一个划分作为一个分支。
2、属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。
3、属性是连续值。此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。
构造决策树的关键性内容是进行属性选择度量,属性选择度量是一种选择分裂准则,它决定了拓扑结构及分裂点split_point的选择。
属性选择度量算法有很多,一般使用自顶向下递归分治法,并采用不回溯的贪心策略。这里介绍常用的ID3算法。
ID3算法
划分数据集的大原则是:将无序的数据变得更加有序
原理
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
信息增益
计算熵
例子:
在决策树当中,设D为用类别对训练元组进行的划分,则D的熵(entropy)表示为:
现在我们假设将训练元组D按属性A进行划分,则A对D划分的期望信息为 :
而信息增益即为两者的差值:
优缺点
优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。既能用于分类,也能用于回归
缺点:可能会产生过度匹配问题
导包
代码语言:javascript复制from sklearn.tree import DecisionTreeClassifier
参数
max_depth: 树的最大深度
梯度提升决策树
导包和使用
代码语言:javascript复制from sklearn.ensemble import GradientBoostingClassifier
GradientBoostingClassifier()
五、朴素贝叶斯
总结历史,预测未来
【关键词】
- 朴素:独立性假设- 贝叶斯公式
思想
代码语言:javascript复制朴素贝叶斯中的朴素一词的来源就是假设各特征之间相互独立。这一假设使得朴素贝叶斯算法变得简单,但有时会牺牲一定的分类准确率。
公式
优点
- 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率;- 对小规模的数据表现很好;- 能处理多分类任务,适合增量式训练;- 对缺失数据不太敏感,算法也比较简单,常用于文本分类
缺点
- 只能用于分类问题- 需要计算先验概率;- 分类决策存在错误率;- 对输入数据的表达形式很敏感
3种贝叶斯模型
高斯分布
高斯分布就是正态分布
【用途】用于一般分类问题
导包
代码语言:javascript复制from sklearn.naive_bayes import GaussianNB
多项式分布
公式
【用途】适用于文本数据(特征表示的是次数,例如某个词语的出现次数)
导包
代码语言:javascript复制from sklearn.naive_bayes import MultinomialNB
伯努利分布
【用途】适用于伯努利分布,也适用于文本数据(此时特征表示的是是否出现,例如某个词语的出现为1,不出现为0)
绝大多数情况下表现不如多项式分布,但有的时候伯努利分布表现得要比多项式分布要好,尤其是对于小数量级的文本数据
公式
导包
代码语言:javascript复制from sklearn.naive_bayes import BernoulliNB
六、随机森林
极端的随机森林
代码语言:javascript复制from sklearn.ensemble import ExtraTreesRegressor
正常的随机森林
代码语言:javascript复制from sklearn.ensemble import RandomForestClassifier
特点
- 在当前所有算法中,具有极好的准确率- 能够有效地运行在大数据集上- 能够处理具有高维特征的输入样本,而且不需要降维- 能够评估各个特征在分类问题上的重要性- 在生成过程中,能够获取到内部生成误差的一种无偏估计- 对于缺省值问题也能够获得很好得结果
优点
1、 在当前的很多数据集上,相对其他算法有着很大的优势,表现良好 2、它能够处理很高维度的数据,并且不用做特征选择,因为特征子集是随机选择的 3、在训练完后,它能够得出特征重要性 4、在创建随机森林的时候,对generlization error使用的是无偏估计,模型泛化能力强 5、随机森林有oob,不需要单独换分交叉验证集 6、训练时树与树之间是相互独立的,训练速度快,容易做成并行化方法 7、对缺失值不敏感,如果有很大一部分的特征遗失,仍可以维持准确度。
缺点:
1、随机森林在某些噪音较大的分类或回归问题上会过拟合 2、对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响
参数
n_estimators : 森林里(决策)树的数目 **criterion : 衡量分裂质量的性能(函数)max_depth : 决策)树的最大深度 **min_samples_split : 分割内部节点所需要的最小样本数量 **min_samples_leaf : 需要在叶子结点上的最小样本数量 **min_weight_fraction_leaf : 一个叶子节点所需要的权重总和(所有的输入样本)的最小加权分数n_jobs : 用于拟合和预测的并行运行的工作作业数量 (进程)
七、支持向量机SVM(Support Vector Machine)
原理
支持向量机,其含义是通过支持向量运算的分类器。其中“机”的意思是机器,可以理解为分类器。那么什么是支持向量呢?在求解的过程中,会发现只根据部分数据就可以确定分类器,这些数据称为支持向量
用途
SVM主要针对小样本数据进行学习、分类和预测(有时也叫回归)的一种方法,能解决神经网络不能解决的过学习问题,而且有很好的泛化能力
解决的问题
- 线性分类 在训练数据中,每个数据都有n个的属性和一个二类类别标志,我们可以认为这些数据在一个n维空间里。我们的目标是找到一个n-1维的超平面(hyperplane),这个超平面可以将数据分成两部分,每部分数据都属于同一个类别。其实这样的超平面有很多,我们要找到一个最佳的。因此,增加一个约束条件:这个超平面到每边最近数据点的距离是最大的。也成为最大间隔超平面(maximum-margin hyperplane)。这个分类器也成为最大间隔分类器(maximum-margin classifier)。支持向量机是一个二类分类器。- 非线性分类 SVM的一个优势是支持非线性分类。它结合使用拉格朗日乘子法和KKT条件,以及核函数可以产生非线性分类器。
详情
SVM的目的是要找到一个线性分类的最佳超平面 f(x)=xw b=0。求 w 和 b。
首先通过两个分类的最近点,找到f(x)的约束条件。
有了约束条件,就可以通过拉格朗日乘子法和KKT条件来求解,这时,问题变成了求拉 格朗日乘子αi 和 b。
对于异常点的情况,加入松弛变量ξ来处理。
非线性分类的问题:映射到高维度、使用核函数。
导包
代码语言:javascript复制from sklearn.svm import SVC,SVR
参数
代码语言:javascript复制kernel: linear # 线性
rbf # 半径
poly # 多项式
八、K均值算法(K-means)聚类
【关键词】K个种子,均值
原理
聚类的概念:一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中
K-Means算法是一种聚类分析(cluster analysis)的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。
K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大
K-Means主要最重大的缺陷——都和初始值有关
K是事先给定的,这个K值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。(ISODATA算法通过类的自动合并和分裂,得到较为合理的类型数目K)
K-Means算法需要用初始随机种子点来搞,这个随机种子点太重要,不同的随机种子点会有得到完全不同的结果。(K-Means 算法可以用来解决这个问题,其可以有效地选择初始点)
步骤
- 从数据中选择k个对象作为初始聚类中心;1. 计算每个聚类对象到聚类中心的距离来划分;1. 再次计算每个聚类中心1. 计算标准测度函数,直到达到最大迭代次数,则停止,否则,继续操作。1. 确定最优的聚类中心
参数和属性
重要参数:
- n_clusters:聚类的个数 重要属性:
- cluster_centers_ : [n_clusters, n_features]的数组,表示聚类中心点的坐标- labels_ : 每个样本点的标签
导包
代码语言:javascript复制from sklearn.cluster import KMeans
常见错误
- k值不合适1. 数据偏差1. 标准偏差不相同1. 样本数量不同
聚类评估:轮廓系数
导包
代码语言:javascript复制from sklearn.metrics import silhouette_score
- 计算样本i到同簇其他样本的平均距离ai。ai 越小,说明样本i越应该被聚类到该簇。将ai 称为样本i的簇内不相似度。- 计算样本i到其他某簇Cj 的所有样本的平均距离bij,称为样本i与簇Cj 的不相似度。定义为样本i的簇间不相似度:bi =min{bi1, bi2, …, bik} - si接近1,则说明样本i聚类合理 - si接近-1,则说明样本i更应该分类到另外的簇 - 若si 近似为0,则说明样本i在两个簇的边界上。
使用
代码语言:javascript复制# 需要传训练数据和预测的结果
silhouette_samples(data, labels) # 返回的是每一个样本的轮廓系数.
九、交叉验证(寻找最优算法)
用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数
导包与使用
代码语言:javascript复制from sklearn.model_selection import GridSearchCV
knn = KNeighborsClassifier()
param_grid = {<!-- -->
'n_neighbors': [3,5,7,9,11],
'weights': ['uniform', 'distance'],
'p': [1,2]
}
gv = GridSearchCV(knn, param_grid=param_grid, n_jobs=5)# param_grid为参数字典 n_jobs 为进程数
属性
- gv.best_score_ : 最佳得分- gv.best_estimator_ : 最佳的算法对象- gv.best_params_ : 最佳参数
十、PCA降维
导包与使用
代码语言:javascript复制from sklearn.decomposition import PCA
# n_components表示要降到多少维,
# whiten = True ,白化, 把数据的标准差变的一致.
pca = PCA(30, whiten=True)
pca.fit_transform(data) # data为高维数组
十一: 特征工程
描述
- 特征是指数据中抽取出来的对结果预测有用的信息- 特征工程是使用专业背景和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程
意义
- 更好的特征意味着更强的灵活性- 更好的特征意味着只需要简单模型- 更好的特征意味着更好的结果
数据清洗方式
- 错误数据- 组合或统计属性判定- 补齐可对应的缺省值
正负样本不平衡的处理方法
- 正负样本量很大,一类样本数量 >> 另一类样本数量, 采用下采样,即对偏多的数据进行采样,使两类样本数量达到一定比例,例如1:1, 3:2等
- 正负样本量不大, 一类样本数量>>另一类样本
- 采集更多的数据- oversampling,即硬生生的增加量少的一方的样本,比如增加几倍的量少的样本(或简单处理量少的数据,例如图像识别中的镜像、旋转),容易过拟合- 修改loss function,例如增加量大的样本的惩罚权重
十二、分类模型
描述
AUC是一个模型评价指标,用于二分类模型的评价。AUC是“Area under Curve(曲线下的面积)”的英文缩写,而这条“Curve(曲线)”就是ROC曲线。
AUC是现在分类模型,特别是二分类模型使用的主要离线评测指标之一 .
相比于准确率、召回率、F1等指标,AUC有一个独特的优势,就是不关注具体得分,只关注排序结果,这使得它特别适用于排序问题的效果评估,例如推荐排序的评估。AUC这个指标有两种解释方法,一种是传统的“曲线下面积”解释,另一种是关于排序能力的解释。例如0.7的AUC,其含义可以大概理解为:给定一个正样本和一个负样本,在70%的情况下,模型对正样本的打分高于对负样本的打分。可以看出在这个解释下,我们关心的只有正负样本之间的分数高低,而具体的分值则无关紧要。
为什么要使用
为什么要用AUC作为二分类模型的评价指标呢?为什么不直接通过计算准确率来对模型进行评价呢?答案是这样的:机器学习中的很多模型对于分类问题的预测结果大多是概率,即属于某个类别的概率,如果计算准确率的话,就要把概率转化为类别,这就需要设定一个阈值,概率大于某个阈值的属于一类,概率小于某个阈值的属于另一类,而阈值的设定直接影响了准确率的计算。使用AUC可以解决这个问题,接下来详细介绍AUC的计算。
导包
代码语言:javascript复制from sklearn.metrics import roc_curve, auc
一个分类模型的分类结果的好坏取决于以下两个部分:
- 分类模型的排序能力(能否把概率高的排前面,概率低的排后面)1. threshold的选择
ROC
图
计算两个指标的值: True Positive Rate=TP/(TP FN),代表将真实正样本划分为正样本的概率 真阳率 False Positive Rate=FP/(FP TN),代表将真实负样本划分为正样本的概率 伪阳率 接着,我们以“True Positive Rate”作为纵轴,以“False Positive Rate”作为横轴,画出ROC曲线。类似下图:
代码演示:
代码语言:javascript复制logistic = LogisticRegression()
i = 1
# 人为的创造fpr_mean
fpr_mean = np.linspace(0,1, 100)
tprs = []
aucs = []
for train,test in skf.split(X,y):
logistic.fit(X[train], y[train])
y_ = logistic.predict_proba(X[test])
# print(y_)
# print('----------------------------------')
# 真实值,和正例的概率
fpr, tpr, thresholds = roc_curve(y[test], y_[:,1])
tpr_mean = interp(fpr_mean ,fpr, tpr)
tprs.append(tpr_mean)
# print(fpr, tpr, thresholds)
# print('---------------------------------------')
auc_ = auc(fpr, tpr)
aucs.append(auc_)
plt.plot(fpr, tpr, label=f'fold {i}, auc: %.4f' % (auc_), alpha=.4)
i = 1
tprs = np.array(tprs)
tpr_mean = tprs.mean(axis=0)
tpr_mean[0] = 0
tpr_mean[-1] = 1
auc_mean = auc(fpr_mean, tpr_mean)
# 算auc的标准差
aucs = np.array(aucs)
auc_std = aucs.std(axis=0)
plt.plot(fpr_mean, tpr_mean, label='auc mean: %.4f$pm$%.4f' % (auc_mean, auc_std),c='g')
plt.legend()