数据分析及算法总结

一. K-近邻算

工做原理

简洁的讲: 若是一个样本在特定的空间中的K个最邻近的中的大多数属于某个类,则这个样本属于这个类.python

用途

k近邻的目的是测量不一样特征值与数据集之间的距离来进行分类web

样本差别性

欧式距离
在这里插入图片描述算法

优缺点

优势:精度高、对异常值不敏感、无数据输入假定。数组

缺点:时间复杂度高、空间复杂度高。网络

适用数据范围:数值型和标称型。app

导包

  1. 分类问题:from sklearn.neighbors import KNeighborsClassifierdom

  2. 回归问题:from sklearn.neighbors import KNeighborsRegressor机器学习

参数

  1. n_neighbors:取邻近点的个数k。k取1-9测试
  2. weight:距离的权重;uniform:一致的权重;distance:距离的倒数做为权重
  3. p:闵可斯基距离的p值; p=1:即欧式距离;p=2:即曼哈顿距离;p取1-6测试

2、线性回归

【关键词】最小二乘法,线性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更小。

概括总结
  1. 岭回归能够解决特征数量比样本量多的问题
  2. 岭回归做为一种缩减算法能够判断哪些特征重要或者不重要,有点相似于降维的效果
  3. 缩减算法能够看做是对一个模型增长误差的同时减小方差
岭回归用于处理下面两类问题:
  1. 数据点少于变量个数
  2. 变量间存在共线性(最小二乘回归获得的系数不稳定,方差很大)

lasso回归

原理

【拉格朗日乘数法】

对于参数w增长一个限定条件,能到达和岭回归同样的效果
在这里插入图片描述

在lambda足够小的时候,一些系数会所以被迫缩减到0

导包

​ from sklearn.linear_model import Lasso

参数:

alpha:调整为小于1的数字

3、逻辑斯蒂回归(分类)

【关键词】Logistics函数,最大似然估计,梯度降低法

Logistics回归的原理

​ 利用Logistics回归进行分类的主要思想是:根据现有数据对分类边界线创建回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。

预测函数

在这里插入图片描述

Cost函数

在这里插入图片描述

梯度降低法求J(θ)的最小值

在这里插入图片描述

​ 训练分类器时的作法就是寻找最佳拟合参数,使用的是最优化算法。接下来介绍这个二值型输出分类器的数学原理

Logistic Regression和Linear Regression的原理是类似的,能够简单的描述为这样的过程:

  1. 找一个合适的预测函数,通常表示为h函数,该函数就是咱们须要找的分类函数,它用来预测输入数据的判断结果
  2. 构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的误差,能够是两者之间的差(h-y)或者是其余的形式 。综合考虑全部训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示全部训练数据预测值与实际类别的误差。
  3. 显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),因此这一步须要作的是找到J(θ)函数的最小值

参数

solver参数的选择:

  • “liblinear”:小数量级的数据集
  • “lbfgs”, “sag” or “newton-cg”:大数量级的数据集以及多分类问题
  • “sag”:极大的数据集

优缺点

​ 优势: 实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低

​ 缺点: 容易欠拟合,分类精度可能不高

4、决策树

【关键词】树,信息增益

构造

​ 信息论

​ 不一样于逻辑斯蒂回归和贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分红不一样的类的属性。所谓决策树的构造就是进行属性选择度量肯定各个特征属性之间的拓扑结构。

​ 构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不一样划分构造不一样的分支,其目标是让各个分裂子集尽量地“纯”。尽量“纯”就是尽可能让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不一样的状况:

1、属性是离散值且不要求生成二叉决策树。此时用属性的每个划分做为一个分支。

  2、属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分红两个分支。

  3、属性是连续值。此时肯定一个值做为分裂点split_point,按照>split_point和<=split_point生成两个分支。

​ 构造决策树的关键性内容是进行属性选择度量,属性选择度量是一种选择分裂准则,它决定了拓扑结构及分裂点split_point的选择。

​ 属性选择度量算法有不少,通常使用自顶向下递归分治法,并采用不回溯的贪心策略。这里介绍经常使用的ID3算法。

ID3算法

​ 划分数据集的大原则是:将无序的数据变得更加有序

原理

​ 决策树(decision tree)是一个树结构(能够是二叉树或非二叉树)。其每一个非叶节点表示一个特征属性上的测试,每一个分支表明这个特征属性在某个值域上的输出,而每一个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别做为决策结果。

信息增益

在这里插入图片描述

计算熵

在这里插入图片描述

例子:

在决策树当中,设D为用类别对训练元组进行的划分,则D的熵(entropy)表示为:
在这里插入图片描述

如今咱们假设将训练元组D按属性A进行划分,则A对D划分的指望信息为 :
在这里插入图片描述

而信息增益即为二者的差值:
在这里插入图片描述

优缺点

​ 优势:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,能够处理不相关特征数据。既能用于分类,也能用于回归

​ 缺点:可能会产生过分匹配问题

导包

from sklearn.tree import DecisionTreeClassifier

参数

​ max_depth: 树的最大深度

梯度提高决策树

导包和使用
from sklearn.ensemble import GradientBoostingClassifier

GradientBoostingClassifier()

5、朴素贝叶斯

总结历史,预测将来

【关键词】

  • 朴素:独立性假设
  • 贝叶斯公式

思想

朴素贝叶斯中的朴素一词的来源就是假设各特征之间相互独立。这一假设使得朴素贝叶斯算法变得简单,但有时会牺牲必定的分类准确率。

公式

在这里插入图片描述

优势

  • 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率;
  • 对小规模的数据表现很好;
  • 能处理多分类任务,适合增量式训练;
  • 对缺失数据不太敏感,算法也比较简单,经常使用于文本分类

缺点

  • 只能用于分类问题
  • 须要计算先验几率;
  • 分类决策存在错误率;
  • 对输入数据的表达形式很敏感

3种贝叶斯模型

高斯分布

​ 高斯分布就是正态分布

​ 【用途】用于通常分类问题

导包
from sklearn.naive_bayes import GaussianNB
多项式分布
公式

在这里插入图片描述

​ 【用途】适用于文本数据(特征表示的是次数,例如某个词语的出现次数)

导包
from sklearn.naive_bayes import MultinomialNB
伯努利分布

​ 【用途】适用于伯努利分布,也适用于文本数据(此时特征表示的是是否出现,例如某个词语的出现为1,不出现为0)

​ 绝大多数状况下表现不如多项式分布,但有的时候伯努利分布表现得要比多项式分布要好,尤为是对于小数量级的文本数据

公式

在这里插入图片描述

导包
from sklearn.naive_bayes import BernoulliNB

6、随机森林

极端的随机森林

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 : 用于拟合和预测的并行运行的工做做业数量 (进程)

7、支持向量机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。

​ 对于异常点的状况,加入松弛变量ξ来处理。

​ 非线性分类的问题:映射到高维度、使用核函数。

导包

from sklearn.svm import SVC,SVR

参数

​kernel: linear  # 线性
    	rbf     # 半径
        poly    # 多项式

8、K均值算法(K-means)聚类

【关键词】K个种子,均值

原理

聚类的概念:一种无监督的学习,事先不知道类别,自动将类似的对象归到同一个簇中

​ K-Means算法是一种聚类分析(cluster analysis)的算法,其主要是来计算数据汇集的算法,主要经过不断地取离种子点最近均值的算法。

​ K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽可能紧密的连在一块儿,而让簇间的距离尽可能的大

K-Means主要最重大的缺陷——都和初始值有关

​ K是事先给定的,这个K值的选定是很是难以估计的。不少时候,事先并不知道给定的数据集应该分红多少个类别才最合适。(ISODATA算法经过类的自动合并和分裂,获得较为合理的类型数目K)

​ K-Means算法须要用初始随机种子点来搞,这个随机种子点过重要,不一样的随机种子点会有获得彻底不一样的结果。(K-Means++算法能够用来解决这个问题,其能够有效地选择初始点)

步骤

  1. 从数据中选择k个对象做为初始聚类中心;
  2. 计算每一个聚类对象到聚类中心的距离来划分;
  3. 再次计算每一个聚类中心
  4. 计算标准测度函数,直到达到最大迭代次数,则中止,不然,继续操做。
  5. 肯定最优的聚类中心

参数和属性

重要参数:

  • n_clusters:聚类的个数

重要属性:

  • cluster_centers_ : [n_clusters, n_features]的数组,表示聚类中心点的坐标
  • labels_ : 每一个样本点的标签

导包

from sklearn.cluster import KMeans

常见错误

  1. k值不合适
  2. 数据误差
  3. 标准误差不相同
  4. 样本数量不一样

聚类评估:轮廓系数

导包
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) # 返回的是每个样本的轮廓系数.

9、交叉验证(寻找最优算法)

​ 用于系统地遍历多种参数组合,经过交叉验证肯定最佳效果参数

导包与使用

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_ : 最佳参数

10、PCA降维

导包与使用

from sklearn.decomposition import PCA

# n_components表示要降到多少维, 
# whiten = True ,白化, 把数据的标准差变的一致.
pca = PCA(30, whiten=True)
pca.fit_transform(data) # data为高维数组

十一: 特征工程

描述

  • 特征是指数据中抽取出来的对结果预测有用的信息
  • 特征工程是使用专业背景和技巧处理数据,使得特征能在机器学习算法上发挥更好的做用的过程

意义

  • 更好的特征意味着更强的灵活性
  • 更好的特征意味着只须要简单模型
  • 更好的特征意味着更好的结果

数据清洗方式

  • 错误数据
  • 组合或统计属性断定
  • 补齐可对应的缺省值

正负样本不平衡的处理方法

  • 正负样本量很大,一类样本数量 >> 另外一类样本数量, 采用下采样,即对偏多的数据进行采样,使两类样本数量达到必定比例,例如1:1, 3:2等
  • 正负样本量不大, 一类样本数量>>另外一类样本
    1. 采集更多的数据
    2. oversampling,即硬生生的增长量少的一方的样本,好比增长几倍的量少的样本(或简单处理量少的数据,例如图像识别中的镜像、旋转),容易过拟合
    3. 修改loss function,例如增长量大的样本的惩罚权重

12、分类模型

描述

​ 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

一个分类模型的分类结果的好坏取决于如下两个部分:

  1. 分类模型的排序能力(可否把几率高的排前面,几率低的排后面)
  2. threshold的选择

ROC

在这里插入图片描述

计算两个指标的值:
  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()