简洁的讲: 若是一个样本在特定的空间中的K个最邻近的中的大多数属于某个类,则这个样本属于这个类.python
k近邻的目的是测量不一样特征值与数据集之间的距离来进行分类web
欧式距离
算法
优势:精度高、对异常值不敏感、无数据输入假定。数组
缺点:时间复杂度高、空间复杂度高。网络
适用数据范围:数值型和标称型。app
分类问题:from sklearn.neighbors import KNeighborsClassifierdom
回归问题:from sklearn.neighbors import KNeighborsRegressor机器学习
- n_neighbors:取邻近点的个数k。k取1-9测试
- weight:距离的权重;uniform:一致的权重;distance:距离的倒数做为权重
- p:闵可斯基距离的p值; p=1:即欧式距离;p=2:即曼哈顿距离;p取1-6测试
【关键词】最小二乘法,线性svg
平方偏差能够写作:
函数
对W求导,当导数为零时,平方偏差最小,此时W等于:
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更小。
【拉格朗日乘数法】
对于参数w增长一个限定条件,能到达和岭回归同样的效果
在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
一、 在当前的不少数据集上,相对其余算法有着很大的优点,表现良好
二、它可以处理很高维度的数据,而且不用作特征选择,由于特征子集是随机选择的
三、在训练完后,它可以得出特征重要性
四、在建立随机森林的时候,对generlization error使用的是无偏估计,模型泛化能力强
五、随机森林有oob,不须要单独换分交叉验证集
六、训练时树与树之间是相互独立的,训练速度快,容易作成并行化方法
七、对缺失值不敏感,若是有很大一部分的特征遗失,仍能够维持准确度。
一、随机森林在某些噪音较大的分类或回归问题上会过拟合
二、对于有不一样取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响
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()