简洁的讲: 如果一个样本在特定的空间中的K个最邻近的中的大多数属于某个类,则这个样本属于这个类.
k近邻的目的是测量不同特征值与数据集之间的距离来进行分类
优点:精度高、对异常值不敏感、无数据输入假定。
缺点:时间复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。
分类问题:from sklearn.neighbors import KNeighborsClassifier
回归问题:from sklearn.neighbors import KNeighborsRegressor
- n_neighbors:取邻近点的个数k。k取1-9测试
- weight:距离的权重;uniform:一致的权重;distance:距离的倒数作为权重
- p:闵可斯基距离的p值; p=1:即欧式距离;p=2:即曼哈顿距离;p取1-6测试
【关键词】最小二乘法,线性
from sklearn.linear_model import LinearRegression
岭回归是加了二阶正则项(lambda*I)的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小。
为了得到一致假设而使假设变得过度严格称为过拟合,
bias:指的是模型在样本上的输出与真实值的误差
variance:指的是每个模型的输出结果与所有模型平均值(期望)之间的误差
from sklearn.linear_model import Ridge
alpha:调整为大于1的数字
1. 缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果
2. 岭回归是加了二阶正则项的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小。
【拉格朗日乘数法】
在lambda足够小的时候,一些系数会因此被迫缩减到0
from sklearn.linear_model import Lasso
alpha:调整为小于1的数字
【关键词】Logistics函数,最大似然估计,梯度下降法
利用Logistics回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。
训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化算法。接下来介绍这个二值型输出分类器的数学原理
Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:
solver参数的选择:
优点: 实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低
缺点: 容易欠拟合,分类精度可能不高
【关键词】树,信息增益
信息论
不同于逻辑斯蒂回归和贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。
构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:
1、属性是离散值且不要求生成二叉决策树。此时用属性的每一个划分作为一个分支。
2、属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。
3、属性是连续值。此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。
构造决策树的关键性内容是进行属性选择度量,属性选择度量是一种选择分裂准则,它决定了拓扑结构及分裂点split_point的选择。
属性选择度量算法有很多,一般使用自顶向下递归分治法,并采用不回溯的贪心策略。这里介绍常用的ID3算法。
划分数据集的大原则是:将无序的数据变得更加有序
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
例子:
在决策树当中,设D为用类别对训练元组进行的划分,则D的熵(entropy)表示为:
现在我们假设将训练元组D按属性A进行划分,则A对D划分的期望信息为 :
优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。既能用于分类,也能用于回归
缺点:可能会产生过度匹配问题
from sklearn.tree import DecisionTreeClassifier
max_depth: 树的最大深度
from sklearn.ensemble import GradientBoostingClassifier
GradientBoostingClassifier()
总结历史,预测未来
【关键词】
朴素贝叶斯中的朴素一词的来源就是假设各特征之间相互独立。这一假设使得朴素贝叶斯算法变得简单,但有时会牺牲一定的分类准确率。
高斯分布就是正态分布
【用途】用于一般分类问题
from sklearn.naive_bayes import GaussianNB
【用途】适用于文本数据(特征表示的是次数,例如某个词语的出现次数)
from sklearn.naive_bayes import MultinomialNB
【用途】适用于伯努利分布,也适用于文本数据(此时特征表示的是是否出现,例如某个词语的出现为1,不出现为0)
绝大多数情况下表现不如多项式分布,但有的时候伯努利分布表现得要比多项式分布要好,尤其是对于小数量级的文本数据
from sklearn.naive_bayes import BernoulliNB
from sklearn.ensemble import ExtraTreesRegressor
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主要针对小样本数据进行学习、分类和预测(有时也叫回归)的一种方法,能解决神经网络不能解决的过学习问题,而且有很好的泛化能力
线性分类
在训练数据中,每个数据都有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。
对于异常点的情况,加入松弛变量ξ来处理。
非线性分类的问题:映射到高维度、使用核函数。
from sklearn.svm import SVC,SVR
kernel: linear # 线性
rbf # 半径
poly # 多项式
【关键词】K个种子,均值
聚类的概念:一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中
K-Means算法是一种聚类分析(cluster analysis)的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。
K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大
K是事先给定的,这个K值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。(ISODATA算法通过类的自动合并和分裂,得到较为合理的类型数目K)
K-Means算法需要用初始随机种子点来搞,这个随机种子点太重要,不同的随机种子点会有得到完全不同的结果。(K-Means++算法可以用来解决这个问题,其可以有效地选择初始点)
重要参数:
重要属性:
from sklearn.cluster import KMeans
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在两个簇的边界上。
# 需要传训练数据和预测的结果
silhouette_samples(data, labels) # 返回的是每一个样本的轮廓系数.
用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数
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 为进程数
from sklearn.decomposition import PCA
# n_components表示要降到多少维,
# whiten = True ,白化, 把数据的标准差变的一致.
pca = PCA(30, whiten=True)
pca.fit_transform(data) # data为高维数组
AUC是一个模型评价指标,用于二分类模型的评价。AUC是“Area under Curve(曲线下的面积)”的英文缩写,而这条“Curve(曲线)”就是ROC曲线。
AUC是现在分类模型,特别是二分类模型使用的主要离线评测指标之一 .
相比于准确率、召回率、F1等指标,AUC有一个独特的优势,就是不关注具体得分,只关注排序结果,这使得它特别适用于排序问题的效果评估,例如推荐排序的评估。AUC这个指标有两种解释方法,一种是传统的“曲线下面积”解释,另一种是关于排序能力的解释。例如0.7的AUC,其含义可以大概理解为:给定一个正样本和一个负样本,在70%的情况下,模型对正样本的打分高于对负样本的打分。可以看出在这个解释下,我们关心的只有正负样本之间的分数高低,而具体的分值则无关紧要。
为什么要用AUC作为二分类模型的评价指标呢?为什么不直接通过计算准确率来对模型进行评价呢?答案是这样的:机器学习中的很多模型对于分类问题的预测结果大多是概率,即属于某个类别的概率,如果计算准确率的话,就要把概率转化为类别,这就需要设定一个阈值,概率大于某个阈值的属于一类,概率小于某个阈值的属于另一类,而阈值的设定直接影响了准确率的计算。使用AUC可以解决这个问题,接下来详细介绍AUC的计算。
from sklearn.metrics import roc_curve, auc
一个分类模型的分类结果的好坏取决于以下两个部分:
计算两个指标的值:
True Positive Rate=TP/(TP+FN),代表将真实正样本划分为正样本的概率 真阳率
False Positive Rate=FP/(FP+TN),代表将真实负样本划分为正样本的概率 伪阳率
接着,我们以“True Positive Rate”作为纵轴,以“False Positive Rate”作为横轴,画出ROC曲线。类似下图:
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()