day2-机器学习的基础模型回顾(相关案例代码理解分享)

day2-机器学习的基础模型回顾(相关案例代码理解分享)


心得体会

开源学习组织datawhale的组队学习第二天,回顾了机器学习中的一些基础模型,也实践了相关模型的基础调用代码,对所有的代码都加了自己的注释与理解,完成了布置的作业任务完,初步领略到机器学习的魅力,在这里感谢datawhale开源社区的小伙伴们给予的学习帮助,今后的学习也要一样加油呀

提示:以下是本篇文章正文内容,下面案例以及设计到的知识点均为datawhale开源组织提供

个人整理的思维导图:
在这里插入图片描述

前言

机器学习的一个重要的目标就是利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。数据通常由一组向量组成,这组向量中的每个向量都是一个样本,我们用xi来表示一个样本,其中i = 1 , 2 , 3 , . . . , N i=1,2,3,…,Ni=1,2,3,…,N,共N个样本,每个样本x i = ( x i 1 , x i 2 , . . . , x i p , y i ) x_i=(x_{i1},x_{i2},…,x_{ip},y_i)x i =(x i1 ,x i2,…,x ip ,y i​ )共p+1个维度,前p个维度的每个维度我们称为一个特征,最后一个维度y i y_iy i 我们称为因变量(响应变量)。特征用来描述影响因变量的因素,如:我们要探寻身高是否会影响体重的关系的时候,身高就是一个特征,体重就是一个因变量。通常在一个数据表dataframe里面,一行表示一个样本x i x_ix i ,一列表示一个特征。根据数据是否有因变量,机器学习的任务可分为:有监督学习和无监督学习

有监督学习:给定某些特征去估计因变量,即因变量存在的时候,我们称这个机器学习任务为有监督学习。如:我们使用房间面积,房屋所在地区,环境等级等因素去预测某个地区的房价。
无监督学习:给定某些特征但不给定因变量,建模的目的是学习数据本身的结构和关系。如:我们给定某电商用户的基本信息和消费记录,通过观察数据中的哪些类型的用户彼此间的行为和属性类似,形成一个客群。注意,我们本身并不知道哪个用户属于哪个客群,即没有给定因变量。
根据因变量的是否连续,有监督学习又分为回归和分类

回归:因变量是连续型变量,如:房价,体重等。
分类:因变量是离散型变量,如:是否患癌症,西瓜是好瓜还是坏瓜等。

一、回归、分类、无监督学习

1.引入相关科学计算包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use("ggplot")
import seaborn as sns

2. 回归

连续型变量问题

这里我们选用task1中比较熟悉的波士顿房价数据集

2.1 导入并查看数据集

from sklearn import datasets
boston = datasets.load_boston()     # 返回一个类似于字典的类
'''
data:特征X的矩阵
target:因变量的向量
feature_names:特征名称
'''
X = boston.data
y = boston.target
features = boston.feature_names

# 这里将特征矩阵X的数据保存到boston_data中,并设置列名为feature_names(特征名称)
boston_data = pd.DataFrame(X,columns=features)
# 将因变量y的数据填入boston_data新开的一列"Price"中
boston_data["Price"] = y
boston_data.head()

在这里插入图片描述

2.2 画散点图

'''
sns.scatterplot(x,y,color,alpha) 画散点图
x,y分别为x轴、y轴数据
alpha为标注点的清晰程度
'''
sns.scatterplot(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6)
plt.title("Price~NOX")     # 设定标题
plt.show()

在这里插入图片描述

3. 分类

离散型变量问题

这里我们选用大名鼎鼎的iris数据集

3.1 导入并查看数据集

# iris数据集
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
features = iris.feature_names
iris_data = pd.DataFrame(X,columns=features)
iris_data['target'] = y
iris_data.head()

这里只显示出前几条数据,iris数据集中target有0、1、2三种值
在这里插入图片描述

3.2 可视化特征

'''
1、plt.scatter()散点图,marker:表示的是标记的样式
2、iloc,即index locate 用index索引进行定位,所以参数是整型,
如:df.iloc[10:20, 3:5]
3、loc,则可以使用column名和index名进行定位,
如:df.loc[‘image1’:‘image10’, ‘age’:‘score’]
'''

marker = ['s','x','o']
for index,c in enumerate(np.unique(y)):
    plt.scatter(x=iris_data.loc[y==c,"sepal length (cm)"],y=iris_data.loc[y==c,"sepal width (cm)"],alpha=0.8,label=c,marker=marker[c])
plt.xlabel("sepal length (cm)")
plt.ylabel("sepal width (cm)")
plt.legend()
plt.show()

在这里插入图片描述

4. 无监督学习

4.1 生成月牙型非凸集

'''
datasets.make_moons()用来生成数据集
n_numbers:生成样本数量
shuffle:是否打乱,类似于将数据集random一下
noise:默认是false,数据集是否加入高斯噪声
random_state:生成随机种子,给定一个int型数据,能够保证每次生成数据相同。
'''
from sklearn import datasets
x, y = datasets.make_moons(n_samples=2000, shuffle=True,
                  noise=0.05, random_state=None)
for index,c in enumerate(np.unique(y)):
    plt.scatter(x[y==c,0],x[y==c,1],s=7)
plt.show()

在这里插入图片描述

4.2 符合正态分布的聚类数据

'''
make_blobs()参数说明
n_features表示每一个样本有多少特征值
n_samples表示样本的个数
centers是聚类中心点的个数,可以理解为label的种类数
'''
from sklearn import datasets
x, y = datasets.make_blobs(n_samples=5000, n_features=2, centers=3)
for index,c in enumerate(np.unique(y)):
    plt.scatter(x[y==c, 0], x[y==c, 1],s=7)
plt.show()

在这里插入图片描述

二、使用sklearn构建完整的机器学习项目流程

一般来说,一个完整的机器学习项目分为以下步骤:

a、明确项目任务:回归/分类
b、收集数据集并选择合适的特征。
c、选择度量模型性能的指标。
d、选择具体的模型并进行训练以优化模型。
e、评估模型的性能并调参。

1.使用sklearn构建完整的回归项目

(1) 收集数据集并选择合适的特征

注:代码与上面的案例一致,选取并导入波士顿房价数据集

(2) 选择度量模型性能的指标

在这里插入图片描述
在这个案例中,我们使用MSE均方误差为模型的性能度量指标。

(3) 选择具体的模型并进行训练

1)线性回归模型

回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。通常使用曲线/线来拟合数据点,目标是使曲线到数据点的距离差异最小。而线性回归就是回归问题中的一种,线性回归假设目标值与特征之间线性相关,即满足一个多元一次方程。通过构建损失函数,来求解损失函数最小时的参数w :
在这里插入图片描述

调用线性回归模型代码:
from sklearn import linear_model      # 引入线性回归方法
lin_reg = linear_model.LinearRegression()       # 创建线性回归的类
lin_reg.fit(X,y)        # 输入特征X和因变量y进行训练
print("模型系数:",lin_reg.coef_)             # 输出模型的系数
print("模型得分:",lin_reg.score(X,y))    # 输出模型的决定系数R^2
2)线性模型推广

在线性回归中,我们假设因变量与特征之间的关系是线性关系,这样的假设使得模型很简单,但是缺点也是显然的,那就是当数据存在非线性关系时,我们使用线性回归模型进行预测会导致预测性能极其低下,因为模型的形式本身是线性的,无法表达数据中的非线性关系。我们一个很自然的想法就是去推广线性回归模型,使得推广后的模型更能表达非线性的关系。

a、多项式回归

为了体现因变量和特征的非线性关系,一个很自然而然的想法就是将标准的线性回归模型换成一个多项式函数,对于多项式的阶数d不能取过大,一般不大于3或者4,因为d越大,多项式曲线就会越光滑,在X的边界处有异常的波动。(图中的边界处的4阶多项式拟合曲线的置信区间(虚线表示置信区间)明显增大,预测效果的稳定性下降。)

案例:
'''
PolynomialFeatures(degree=2, *, interaction_only=False, include_bias=True, order='C'):
degree:特征转换的阶数。
interaction_only:是否只包含交互项,默认False 。
include_bias:是否包含截距项,默认True。
order:str in {‘C’, ‘F’}, default ‘C’,输出数组的顺序。
'''

from sklearn.preprocessing import PolynomialFeatures
X_arr = np.arange(6).reshape(3, 2)
print("原始X为:\n",X_arr)

poly = PolynomialFeatures(2)
print("2次转化X:\n",poly.fit_transform(X_arr))

poly = PolynomialFeatures(interaction_only=True)
print("2次转化X:\n",poly.fit_transform(X_arr))

在这里插入图片描述

b、广义可加模型(GAM)

广义可加模型GAM实际上是线性模型推广至非线性模型的一个框架,在这个框架中,每一个变量都用一个非线性函数来代替,但是模型本身保持整体可加性。GAM模型不仅仅可以用在线性回归的推广,还可以将线性分类模型进行推广。

GAM模型的优点与不足:

优点:

简单容易操作,能够很自然地推广线性回归模型至非线性模型,使得模型的预测精度有所上升;由于模型本身是可加的,因此GAM还是能像线性回归模型一样把其他因素控制不变的情况下单独对某个变量进行推断,极大地保留了线性回归的易于推断的性质。

**

缺点:

**
GAM模型会经常忽略一些有意义的交互作用,比如某两个特征共同影响因变量,不过GAM还是能像线性回归一样加入交互项 x(i)×x(j) 的形式进行建模;但是GAM模型本质上还是一个可加模型,如果我们能摆脱可加性模型式,可能还会提升模型预测精度,详情请看后面的算法。

案例:
from pygam import LinearGAM
gam = LinearGAM().fit(boston_data[boston.feature_names], y)
gam.summary()

在这里插入图片描述

3)回归树

基于树的回归方法主要是依据分层和分割的方式将特征空间划分为一系列简单的区域。对某个给定的待预测的自变量,用他所属区域中训练集的平均数或者众数对其进行预测。由于划分特征空间的分裂规则可以用树的形式进行概括,因此这类方法称为决策树方法。决策树由结点(node)和有向边(diredcted edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类别或者某个值。区域 R1,R2 等称为叶节点,将特征空间分开的点为内部节点。

回归树与线性模型的比较:
线性模型的模型形式与树模型的模型形式有着本质的区别。例如,如果特征变量与因变量的关系能很好的用线性关系来表达,那么线性回归通常有着不错的预测效果,拟合效果则优于不能揭示线性结构的回归树。反之,如果特征变量与因变量的关系呈现高度复杂的非线性,那么树方法比传统方法更优。

案例:
'''
DecisionTreeRegressor()参数:
criterion:{“ mse”,“ friedman_mse”,“ mae”},默认=“ mse”。衡量分割标准的函数 。
splitter:{“best”, “random”}, default=”best”。分割方式。
max_depth:树的最大深度。
min_samples_split:拆分内部节点所需的最少样本数,默认是2。
min_samples_leaf:在叶节点处需要的最小样本数。默认是1。
min_weight_fraction_leaf:在所有叶节点处(所有输入样本)的权重总和中的最小加权分数。如果未提供sample_weight,则样本的权重相等。默认是0。
'''
from sklearn.tree import DecisionTreeRegressor
reg_tree = DecisionTreeRegressor(criterion = "mse",min_samples_leaf = 5)
reg_tree.fit(X,y)
reg_tree.score(X,y)

在这里插入图片描述

4)支持向量机回归(SVR)

在线性回归的理论中,每个样本点都要计算平方损失,但是SVR却是不一样的。SVR认为:落在 𝑓(𝑥) 的 𝜖 邻域空间中的样本点不需要计算损失,这些都是预测正确的,其余的落在 𝜖 邻域空间以外的样本才需要计算损失。
在这里插入图片描述

案例:
'''
kernel:核函数,{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’}, 默认=’rbf’。
degree:多项式核函数的阶数。默认 = 3。
C:正则化参数,默认=1.0。
epsilon:SVR模型允许的不计算误差的邻域大小。默认0.1。
'''
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler     # 标准化数据
from sklearn.pipeline import make_pipeline   # 使用管道,把预处理和模型形成一个流程

reg_svr = make_pipeline(StandardScaler(), SVR(C=1.0, epsilon=0.2))
reg_svr.fit(X, y)
reg_svr.score(X,y)

三、作业

(1)请详细阐述线性回归模型得最小二乘法表达

最小二乘法即为求解未知参数,使残差(理论值与观测值之差)的平方和达到最小。
对残差二范数的平方和表达式求导,得到使表达式的值最小时的w

(2)在线性回归模型中,极大似然估计与最小二乘估计有什么联系与区别吗

区别:
原理上:最小二乘估计,最合理的参数估计量应该使得模型能最好地拟合样本数据,也就是估计值和观测值之差的平方和最小;而最大似然法,最合理的参数估计量应该使得从模型中抽取该n组样本观测值的概率最大,也就是概率分布函数或者说是似然函数最大。
函数上:最小二乘法以估计值与观测值的差的平方和作为损失函数,极大似然法则是以最大化目标值的似然概率函数为目标函数,从概率统计的角度处理线性回归并在似然概率函数为高斯函数的假设下同最小二乘建立了的联系。

联系:
测量误差(测量)服从高斯分布的情况下, 最小二乘法等价于极大似然估计。

(3)为什么多项式回归在实际问题中的表现经常不是很好

用多项式拟合逼近时,为尽可能地拟合训练数据,所得的多项式次数可能过高,未做正则化处理,发生过拟合,模型在边缘晃动,也可能出现龙格现象,次数越大的时候误差越大。

(4)决策树模型与线性模型之间的联系与差别

区别:
树模型:可视化性好,可以通过图表直观的读取结论信息,可解释性更强,可得到有最强区分样本的能力,一般用于处理特征空间复杂的模型。
线性模型:易于做拟合曲线,模型相对简单,往往预测精度较高,方差较低。

联系:
树模型与线性模型都可以用于分类问题

(5)什么是KKT条件

KKT条件是求解带不等式约束的最优化问题中非常重要的一个概念和方法。
一、带等式约束的优化问题
带等式约束的优化问题是指我们有个求最大值或者最小值的目标函数,同时,针对该目标函数我们还有一些约束条件,这些约束条件是等式。该问题的形式化描述如下:
在这里插入图片描述
求解上述问题一般有两种方法,一种是消元法,就是把这些等式联立,然后求解即可。也就是多元一次方程组的求解了。之类不多说了。另一种方法是拉格朗日乘数法,这是高等数学里面提供的一种方法。这是一种寻找多元函数在其变量受到一个或者多个条件的约束的时候,求极值的方法。该方法将一个有nn个变量和kk个等式约束条件的最优化问题,转换成一个有n+kn+k个变量的方程组求解问题。该方法会引入一组未知数,这些未知数称为拉格朗日乘子(或者算子、乘数等)。对上式进行拉格朗日乘数法转换得到一个新的函数:
在这里插入图片描述
这个时候对上述转换后的方程求解其极值点会包含原问题所有的极值点,但是不保证每个极值点都是原问题的极值点。这个理论上有证明这里忽略了。因此,当转换后的公式只包含一个极值点的时候,我们可以对上市求偏导后联立方程,得到的结果就是原来结果的极值点。上式中的未知数包含了所有的x和λ:
在这里插入图片描述
二、带不等式约束的最优化问题
与拉格朗日乘法类似,如果最优化问题的约束是不等式,那么我们可以使用KKT条件来求解。KKT条件就是拉格朗日乘数法在带不等式约束优化问题上的推广。

假设我们有如下的最优化问题:

在这里插入图片描述
那么该问题的拉格朗日函数为:

在这里插入图片描述
KKT条件是指一组条件,它是一组解成为原问题最优解的必要条件。如果原问题是凸问题,那么这个条件也是充分条件。K.K.T.条件包括平稳条件、互补松弛条件、对偶可行性条件、原问题可行性条件等几类。上述问题的KKT条件如下:

在这里插入图片描述

(6)为什么要引入原问题的对偶问题

1)对偶问题将原始问题中的约束转为了对偶问题中的等式约束
2)方便核函数的引入
3)改变了问题的复杂度。由求特征向量w转化为求比例系数a,在原始问题下,求解的复杂度与样本的维度有关,即w的维度。在对偶问题下,只与样本数量有关。
4)求解更高效,因为只用求解比例系数a,而比例系数a只有支持向量才为非0,其他全为0.

(7)使用CH1机器学习数学基础所学的内容,找到一个具体的数据集,使用线性回归模型拟合数据,要求不能使用sklearn,只能使用python与numpy

import numpy as np
from sklearn import datasets   #sklearn生成数据集都在这里
from matplotlib import pyplot as plt

# 生成一个特征的回归数据集
'''
n_features:特征数(自变量个数)
noise:噪音
random_state:随机状态若为固定值则每次产生的数据都一样
'''
x,y = datasets.make_regression(n_features=1,noise=15,random_state=2021)

# 得到矩阵
m = x.shape[0]
# np.concatenate()能够一次完成多个数组的拼接,axis=1表示对应行的数组进行拼接,axis=0为按列拼接
X = np.concatenate((np.ones((m,1)),x),axis=1)
# np.mat()生成数组
xMat = np.mat(X)
yMat = np.mat(y.reshape(-1,1))
xTx = xMat.T * xMat
# xTx.I为xTx的逆矩阵
ws = xTx.I * xMat.T * yMat

# 作图
plt.figure()
plt.scatter(x,y,c = 'k')
plt.plot(x, xMat * ws, 'r')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

在这里插入图片描述

总结

以上就是今天要讲的内容,本文仅仅简单回顾了机器学习中的一些基础模型,也实践了相关模型的基础调用代码,复现了一些案例,做了本人的理解与注释,在这里再次感谢datawhale开源社区的小伙伴们的学习帮助,如更多的学习资料请联系datawhale参加组队学习获取。

相关资料:
【1】教学视频:https://www.bilibili.com/video/BV1Mb4y1o7ck?from=search&seid=6085778383215596866
【2】教案:https://github.com/datawhalechina/ensemble-learning
【3】datawhale开源学习社区:http://datawhale.club/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值