书小宅之机器学习

sklearn官方文档地址
命令行下在python /scripts文件夹下使用easyintasll pip安装pip;
要使用sklearn,如果你已经安装了Numpy和Scipy,最简单的安装方法就是使用Pip:
pip install -U scikit-learn 或者
conda install scikit-learn
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

目标函数:在算法模型优化过程中,优化的方向函数,每次迭代优化的时候都让这个目标函数的值更小化,最优解是目标函数最小化时候对应的参数值。

损失函数:一般情况下和目标函数是同一个,有时候损失函数表达的意义是指当我们的模型参数给定的时候,预测值和实际值之间的差距。

目标函数优化方式:目标函数一般情况都是凸函数,所以常用的优化方案:最小二乘、梯度下降
过拟合

  • 表现形式:模型在训练集上效果非常家,但是在测试机上效果不好;
  • 产生原因:进入算法模型训练的这个数据集特别契合算法模型,导致训练出来的模型很完美,但是实际的数据一定和训练集数据存在不一致的地方,导致该模型在数据集上效果不好。
  • 解决方案:L1-norm、L2-norm
    模型持久化、管道、模型效果评估
    交叉验证
    在这里插入图片描述
    卡方j检验:统计样本的实际观测值与理论推断之间的偏离程度。卡方值越大,偏差越大,实际观测值和理论推测越不符合【针对分类变量】

线性回归

从数据中找出特征矩阵X和目标属性Y之间的线性关系/线性函数。
hΘ(x) = Θ0 + Θ1x1 + Θ2x2 + …… + Θnxn
多项式扩展:主要的功能是把低维度空间数据映射到高维度空间中。
(a,b)->(a,b,ab,a2,b2)
(a,b)->(a,b,ab,a2,b2,a2b,ab2,a3b3)
线性回归+多项式扩展

  • 如果数据本身不是线性关系,那么直接使用线性回归模型效果不会太好->会存在欠拟合;
  • 数据在低维空间中不是线性关系,但是如果将数据映射到高维空间时,数据可能会变成线性关系,从而可以使用线性回归;
  • 如果映射的维度特别高,那么数据完全变成线性的,从而训练出来的模型会非常契合训练数据;但实际的数据可能会和训练数据存在一定的误差,从而可能会导致模型在其他数据集上效果不佳->可嫩存在过拟合;

Logistic回归

本质:二分类算法,计算的是样本x属于某一个类别的概率为p,样本属于另外一个类别的概率为1-p;最终认为X属于概率最大的那一个类别。

Softmax回归

本质:将一个K维的任意实数向量压缩(映射)成另一个K维的实数向量,其中向量中的每个元素取值都介于(0,1)之间。
和Logistic回归的区别是,Softmax是一个多分类算法,需要计算样本属于某一个类别的概率,最终认为样本属于类别最大的类别;
Softmax会为每一个类别训练一个参数Θ向量,所以在Softmax中需要求解的参数其实是一个由k个向量组成的Θ矩阵。

KNN

原理:认为相似的样本在样本空间中国比较接近,所以使用和当前样本比较接近的其他样本的目标属性值不作为我当前样本的预测值。
预测规则

  • 分类:多数投票&甲醛多数投票;
  • 回归:平均值&加权的平均值
  • 注意:权重给定一般选择:权重和距离成反比

相似度度量

  • 需要找相似的样本,认为样本的特征向量在空间中的点之间的距离体现了样本之间的相似性,越近的 点越相似;
  • 一般使用欧几里得距离

如何找最近邻的样本?

  • 暴力方式:计算所有样本到当前样本的距离,然后获取最近的k个样本;
  • TD Tree:通过建立TD Tree,减少计算量。

信息熵(Entropy)

H(x)是随机变量的信息熵:
在这里插入图片描述
高信息熵:表示随机变量X是均匀分布的,各种取值情况是等概率出现的。
低信息熵:表示随机变量X各种取值不是等概率出现的,可能有的事件出现的概率很大,有的事件出现的概率很小。
信息量:指的是一个样本/事件所蕴含的信息,如果一个事件的概率越大,那么就可以认为该事件所蕴含的信息越少,如确定事件不含任何信息量。
香农信息熵:一个系统越有序,信息熵就越低;一个系统越混乱,信息熵就越高,所以信息熵被认为是一个系统有序程度的度量——用来描述系统信息量的不确定度
条件熵H(Y/X):给定条件X的情况下,随机变量Y的信息熵就叫条件熵H(Y/X)。

  • 所有不同X值情况下的信息熵的平均值叫做条件熵:
    H(Y/X)= H(X,Y)-H(X)

分类树h和决策树de的区别

  • 分类树采用信息增益、信息增益率、基尼系数来评价树的效果,都是基于概率值进行判断的;而分类树的叶子节点的预测值-般为叶子节点中概率最大的类别作为当前叶子的预测值。
  • 在回归树种,叶子节点的预测值-般为叶子节点电所有值的均值来作为当前叶子节点的预测值。所以在回归树中一般采用MSE作为树的评价指标,即均方差。
  • 一般情况下,只会使用CART算法构建回归树。

决策树

概念

  • 决策树的决策过程就是从根节点开始,测试待分类项中对应的特征属性,并按照其值选择输出分支,直达叶子节点,将叶子节点的存放类别作为决策树的结果。
  • 在已知各种情况发生概率的基础上,通过决策树来进行分析;
  • 是一种直观应用概率分析的图解法;
  • 决策树是一种预测模型,代表对象属性与对象值之间的映射关系;
  • 决策数是一种树型结构,其中每个内部节点表示是一个树型的测试,每个节点表示是一个测试输出,每个叶节点代表一种类别;
  • 是一种非常常用的有监督的分类算法。
  • 决策树分为两大类:分类树回归数,前者用于分类标签值,后者用于预测连续值,常用的算法有ID3、C4.5、CART等。

决策树的构建
决策树算法的重点就是决策树的构造,决策树的构造就是进行属性选择度量,确定各个特征属性之间的拓扑结构(树结构);
构建决策树的关键步骤是分裂属性:在某一个节点按照某一类特征属性的不同划分构建不同的分支,其目标就是让各个分裂子集尽可能地纯,即让一个分裂子类中待分类地项尽可能地属于同一个类别。
决策树的步骤:
1、将所有地特征看成一个一个地节点;
2、遍历每个特征地每一种分割方式,找到最好地分割点,将数据划分为不同地子节点:N1、N2、Nm,计算划分之后所有子节点地“纯度”信息;
3、对第二步产生地分割,选择出最优地特征及最优地划分方式;得出最终地子节点:N1、N2、Nm
4、对子节点N1、N2、Nm分别继续执行2~3步,知道每个最终子节点都足够“纯”。

决策树可视化

  • graphviz服务安装:
    下载安装包(msi安装包):http://www.graphviz.org/
    将graphviz的根目录下的bin文件夹路径添加到PATH环境变量中;
  • 安装python的graphviz插件:pip install graphviz
  • 安装python的pydotplus插件:pip install pydotplus
  • 使用方法:
    1、将模型输出dot文件,然后使用graphviz的命令将dot文件转换为pdf格式文件;
    2、将pydotplus插件直接生成pdf文件进行保存;
    3、使用Image对象直接现实是pydotplus生成的图片

信息增益度:当计算出各个特征属性的量化纯度值后使用信息增益度来选择出当前数据集的分隔特征属性;如果信息增益度的值越大,表示在该特征属性上会损失的纯度越大,那么该属性就应该在决策树的上层。
Gain(A) = △ = H(D) - H(D/A)

决策树算法停止条件
决策树构建的过程是一个递归的过程,所以必须给定停止条件,否则过程将不会停止:
1、当每个子节点只有一种类型的时候停止构建(可能会过拟合);
2、当前节点中记录数小于某个阈值,同时迭代次数达到给定值时,停止构建过程,此时使用max(p(i))作为节点的对应类型

评估
准确率、召回率、精确率、叶子节点的纯度值总和。

剪枝
前置剪枝:在构建决策树的过程中,提前停止,结果是决策树一般比较小,实践证明这种策略的结果一般不太好;、
后置剪枝:在决策树构建好后,开始剪枝(计算效率低)
1、用单一叶子节点代替整个子树;
2、将一颗子树完全替代另一颗子树。

算法
ID3:内部使用信息熵信息增益来进行构建;每次迭代选指责信息增益最大的特征属性作为分隔属性;【单变量决策树、小规模数据集】
C4.5:使用信息增益率来取代ID3算法中信息增益,在树的构造过程中会进行剪枝操作进行优化;能够自动完成对连续性属性的离散化处理;【属性值取值较多,单变量决策树、小规模数据集】
CART(Classification And Regression Tree 分类回归树):使用基尼系数(GINI增益)作为数据纯度的量化指标来构建决策树,选择GINI增益最大的作为当前数据集的分隔属性(解决分类和回归问题)【二叉树、】

算法支持模型树结构特征选择连续值处理缺失值处理剪枝特征属性多次使用
ID3分类多叉树信息增益不支持不支持不支持不支持
C4.5分类多叉树信息增益率支持支持支持不支持
CART分类、回归二叉树基尼系数、均方差支持支持支持支持
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import warnings

from sklearn import tree #决策树
from sklearn.tree import DecisionTreeClassifier #分类决策树
from sklearn.model_selection import train_test_split #测试集和训练集
from sklearn.pipeline import Pipeline #管道:当我们有很多数据需要做一段类似的操作的时候我们就可以使用Pipline管道
from sklearn.feature_selection import SelectKBest #特征选择
from sklearn.feature_selection import chi2 #卡方统计量
from sklearn.datasets  import load_iris
from sklearn.preprocessing import MinMaxScaler #数据归一化
from sklearn.decomposition import PCA #主成分分析
from sklearn.model_selection import GridSearchCV #网格搜索交叉验证,用于选择最优的参数

# 设置属性防止中文乱码
mpl.rcParams['font.sans-serif']=[u'SimHei'] #用来正常侠士中文标签
mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号

warnings.filterwarnings('ignore',category=FutureWarning)

iris_feature_E='sepal length','sepal width','petal length','petal width'
iris_feature_C='花萼长度','花萼宽度','花瓣长度','花瓣宽度'
iris_class='Iris-setosa','Iris-versicolor','Iris-virginca'

# 读取数据
path = './datas/iris.txt'  # 数据文件路径
data = pd.read_csv(path, header=None)
# x = data[np.arange(0,4)]
x = data[list(range(4))]   #获取x变量
#print(x.head())
y = pd.Categorical(data[4]).codes  #Categorical:编码包含大量重复文本的数据,codes把数据y转换成分类型的01,2
print("总样本数目:%d;特征属性数目:%d"%x.shape)
print(y)

data.head(5)

#数据进行分隔(训练数据和测试数据)
x_train1, x_test1, y_train1, y_test1 = train_test_split(x, y, train_size=0.8, random_state=14)

#对数据集进行映射
x_train,x_test,y_train,y_test=x_train1,x_test1,y_train1,y_test1
print("训练数据集样本数目:%d,测试数据集样本数目:%d"%(x_train.shape[0],x_test.shape[0]))
#强制转换为int类型:需要体现分类模型,DecisionTreeClassifier 是分类算法,要求y必须是int
y_train=y_train.astype(np.int)
y_test=y_test.astype(np.int)

y_train

#数据标准化
#StandardScaler(基于特征矩阵的列,将属性值转换至服从正态分布)
#标准化是依照特征矩阵的列处理数据,其通过求z-score得方法,将样本得特征值转换到同一量纲下
#常用于基于正态分布算法,比如回归

# 数据归一化(映射)
#MinMaxScaler(区间缩放,基于最大最小值,将数据转换到01区间上)
#提升模型收敛速度,提升模型精度
# 常见用于神经网络

# Normalizer(基于矩阵得行,将样本向量转换为单位向量)
# 其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一得标准
# 常见用于文本分类和聚类,logistic回归中也会使用,有效防止过拟合

ss = MinMaxScaler()#用标准方法对数据进行处理并转换
#在scikit learn中模型API说明:
#fit:模型训练,基于给定得训练集(X,Y)测试出一个模型,该API没有返回值
#eg:ss.fit(X_train,Y_train)执行后ss这个模型对象就训练好了
# transform:数据转换,使用训练好的模型对给定得数据集进行转换操作
#如果训练集进行了转换操作,测试集也需要进行转换操作
#这个API只在特征工程过程中出现
#predict:数据转换/数据预测,功能和transform一样,都是对给定的数据集X进行转换操作,
# 只是transform中返回的是一个新的X,在predict中返回预测值Y,这个API只在算法模型中出现
#fit_transform:先根据给定的数据训练模型,然后使用训练好额模型对给定的数据进行转换操作。

x_train = ss.fit_transform(x_train)
x_test = ss.transform(x_test)
print("原始数据各个特征的调整最小值:",ss.min_)
print("原始数据各个特征的缩放数据值:",ss.scale_)

#特征选择:从已有的特征属性中选择出影响目标最大的特征属性
#常用方法:{分类:F统计量、卡方系数、互信息mutual_info_classif
#连续:皮尔逊相关系数、F统计量、互信息mutual_info_classif}
#SelectKBest(卡方系数)
ch2 = SelectKBest(chi2,k=3) #当前案例中,用SelectKBest方法从四个原始特征属性中选择出最能影响目标的3个特征属性
                            # k 默认为10,指定后会返回想要的特征个数
x_train = ch2.fit_transform(x_train,y_train)    #训练并转换
x_test = ch2.transform(x_test)      #转换
select_name_index = ch2.get_support(indices=True)
print("对类别判别影响最大的三个特征属性分别是:",ch2.get_support(indices=False))
print(select_name_index)

#降维:对于数据而言,如果特征属性比较多,在构建过程中会比较复杂,
# 这时将多维(高维)降到低维空间中
#常用的降维方法:
# PCA  主成分分析(无监督);人脸识别通常先做一次PCA
# LDA  线性判别分析(有监督),类内方差最小

pca = PCA(n_components=2)   #构建一个PCA对象,设置最终维度为2维
#这里为了后边画图方便,将数据维度设置为 2,一般用默认不设置就可以

x_train = pca.fit_transform(x_train)
x_test = pca.transform(x_test)

#模型构建
model = DecisionTreeClassifier(criterion="entropy",random_state=0)#也可以选gini
#模型训练
model.fit(x_train,y_train)
#模型预测
y_test_hat = model.predict(x_test)

#模型结果评估
y_test2=y_test.reshape(-1)
resule=(y_test2==y_test_hat)
print("准确率:%.2f%%"%(np.mean(resule)*100))
#实际可通过参数获取
print("Score:",model.score(x_test,y_test))#准确率
print("Classes:",model.classes_)

#画图
N=100#横纵各采样多少个值
x1_min = np.min((x_train.T[0].min(),x_test.T[0].min()))
x1_max = np.max((x_train.T[0].max(),x_test.T[0].max()))
x2_min = np.min((x_train.T[1].min(),x_test.T[1].min()))
x2_max = np.max((x_train.T[1].max(),x_test.T[1].max()))

t1 = np.linspace(x1_min,x1_max,N)
t2 = np.linspace(x2_min,x2_max,N)
x1,x2 = np.meshgrid(t1,t2)  #生成网格采样点
x_show = np.dstack((x1.flat,x2.flat))[0]#测试点

y_show_hat = model.predict(x_show)#预测值

y_show_hat = y_show_hat.reshape(x1.shape)#使之与输入的形状相同
print(y_show_hat.shape)
print(y_show_hat[0])

#画图
plt_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])#颜色
plt_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])

plt.figure(facecolor="w")
#区域图
plt.pcolormesh(x1,x2,y_show_hat,cmap=plt_light)
#画测试数据的点信息
plt.scatter(x_test.T[0],x_test.T[1],c=y_test.ravel(),edgecolors='k',s=150,zorder=10,cmap=plt_dark,marker='*')
#画训练数据的点信息
plt.scatter(x_train.T[0],x_train.T[1],c=y_train.ravel(),edgecolors='k',s=40,cmap=plt_dark)
plt.xlabel(u"特征属性1",fontsize=15)
plt.ylabel(u"特征属性2",fontsize=15)
plt.xlim(x1_min,x1_max)
plt.ylim(x2_min,x2_max)
plt.grid(True)
plt.title(u"鸢尾花数据的决策树分类",fontsize=18)
plt.savefig("鸢尾花数据的决策树分类.png")
plt.show()

# 参数优化
pipe = Pipeline([
    ('mms', MinMaxScaler()),
    ('skb', SelectKBest(chi2)),
    ('pca', PCA()),
    ('decision', DecisionTreeClassifier())
])

# 参数
parameters = {
    "skb__k": [1, 2, 3, 4],
    "pca__n_components": [0.5, 0.99],#设置为浮点数代表主要成分所占最小比例的阈值
    "decision__criterion": ["gini" ,"entropy"],
    "decision__max_depth": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
}

#数据
x_train2, x_test2, y_train2, y_test2 = x_train1, x_test1, y_train1, y_test1
#模型构建:通过网格交叉验证,寻找最优参数列表,param_grid可选参数列表,cv:进行几折交叉验证
gscv = GridSearchCV(pipe, param_grid=parameters)
#模型训练
gscv.fit(x_train2, y_train2)
#算法的最优解
print("最优参数列表:", gscv.best_params_)
print("score值:", gscv.best_score_)
#预测值
y_test_hat2 = gscv.predict(x_test2)

#应用最优参数看效果
mms_best = MinMaxScaler()
skb_best = SelectKBest(chi2, k=2)
pca_best = PCA(n_components=0.5)
decision3 = DecisionTreeClassifier(criterion="gini", max_depth = 2)
x_train3, x_test3, y_train3, y_test3 = x_train1, x_test1, y_train1, y_test1
x_train3 = pca_best.fit_transform(skb_best.fit_transform(mms_best.fit_transform(x_train3, y_train3), y_train3))
x_test3 = pca_best.transform(skb_best.transform(mms_best.transform(x_test3)))
decision3.fit(x_train3, y_train3)
print("正确率:", decision3.score(x_test3, y_test3))

x_train4, x_test4, y_train4, y_test4 = train_test_split(x.iloc[:, :2], y, train_size=0.7, random_state=14)

depths = np.arange(1, 15)
err_list = []
for d in depths:
    clf = DecisionTreeClassifier(criterion='gini', max_depth = d)
    clf.fit(x_train4, y_train4)

    score = clf.score(x_test4, y_test4)
    err = 1 - score
    err_list.append(err)
    print("% d深度,正确率 % .5f" % (d, score))


    ## 画图
    plt.figure(facecolor='w')
    plt.plot(depths, err_list, 'ro -', lw = 3)
    plt.xlabel(u"决策树深度", fontsize = 16)
    plt.ylabel(u"错误率", fontsize = 16)
    plt.grid(True)
    plt.title(u"决策树层次太多导致的拟合问题(欠拟合和过拟合)", fontsize = 18)
    plt.savefig("决策树层次太多导致的拟合问题(欠拟合和过拟合).png")
    plt.show()

随机森林

在随机森林的构建过程中,由于各课树之间是没有关系地,相对独立的;在构建的过程中,构建第m棵子树的时候 ,不会考虑前面的m-1棵树;
各个决策树组成随机森林之后,在形成最终结果的时候能不能给定一种既定的决策顺序,即哪棵子树先决策,哪颗子树后决策。

Boosting

提升学习(Boosting)是一种机器学习技术,可以用于回归分类问题,他的每一步产生弱预测模型(如决策树),并加权累加到总模型中;
如果每一步的弱预测模型的生成都是依据损失函数的梯度方式的,那么就称为梯度提升(Gradient boosting);
意义:如果一个问题存在弱预测模型,那么可以通过提升技术的办法得到一个强预测模型;
常见的模型有:Adaboost、Gradient Boosting(GBT/GBDT/GBRT)
在这里插入图片描述

Bagging、Boosting的区别

■1. 样本选择: Bagging算法是有放回的随机采样; Boosting算法是每轮训练集不变,只是训练集中
的每个样例在分类器中的权重发生变化,而权重根据上一轮的分类结果进行调整;
■2. 样例权重: Bagging使用随机抽样,样例的权重; Boosting根据错误率不断的调整样例的权重值,错误率越大则权重越大;
■3. 预测函数: Bagging所有预测模型的权重相等; Boosting算法对于误差小的分类器具有更大的权重。■4. 并行计算: Bagging算法可以并行生成各个基模型; Boosting理论上只能顺序生产,因为后-个模
型需要前一个模型的结果;
■5. Bagging是减少模型的variance(方差) ; Boosting是减少模型的Bias(偏度)。
■6. Bagging里每个分类模型都是强分类器,因为降低的是方差,方差过高需要降低是过拟合;Boosting里每个分类模型都是弱分类器,因为降低的是偏度,偏度过高是欠拟合。

AdaBoost算法

是一种迭代算法。每轮迭代中会在训练集上产生一个新的学习器,然后使用该学习器对所有样本进行预测,以评估每个样本的重要性。
算法为每个样本赋予一个权重,每次用训练好的学习器标注/预测各个样本,如果某个样本点被预测的越正确,则将其权重降低;否则提高样本的权重;
权重越高的样本在下一个迭代训练中所占的比重就越大,也就是说越难区分的样本在训练过程中会变得越重要。
整个训练过程直到错误率足够小或者达到一定的迭代次数即终止。
将及分类器的线性组合作为强分类器,同时给分类误差率较小的基本分类器以大的权值,同时给分类误差率较大的基本分类器以小的权值。
最终分类器在线性组合的基础上进行Sign函数转换(离散化):
在这里插入图片描述

from sklearn.externals.six.moves import zip
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

from sklearn.ensemble import AdaBoostClassifier #adaboost方法得引入
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles #构造数据
from sklearn.metrics import accuracy_score #计算roc和auc

Stacking

■Stacking是指训练一个模型用于组合(combine)其它模型(基模型/基学习器)的技
术。即首先训练出多个不同的模型,然后再以之前训练的各个模型的输出作为输入来新训练一个新的模型,从而得到一一个最终的模型。-般情况下使用单层的Logistic回归作为组合模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值