DataWhale sklearn学习笔记(一)

线性回归

数据生成:

生成数据的思路是设定一个二维的函数(维度高了没办法在平面上画出来),根据这个函数生成一些离散的数据点,对每个数据点我们可以适当的加一点波动,也就是噪声,最后看看我们算法的拟合或者说回归效果。

import numpy as np
import matplotlib.pyplot as plt 

def true_fun(X): # 这是我们设定的真实函数,即ground truth的模型
    return 1.5*X + 0.2

np.random.seed(0) # 设置随机种子
n_samples = 30 # 设置采样数据点的个数

'''生成随机数据作为训练集,并且加一些噪声'''
X_train = np.sort(np.random.rand(n_samples)).reshape(n_samples, 1)  # 原始数据样本 shape[30, 1]
y_train = y_train = (true_fun(X_train) + np.random.randn(n_samples,1) * 0.05)  # 增加了一些噪声,数据标签shape[30, 1] 

定义模型

生成数据之后,我们可以定义我们的算法模型,直接从sklearn库中导入类LinearRegression即可,由于线性回归比较简单,所以这个类的输入参数也比较少,不需要多加设置。 定义好模型之后直接训练,就能得到我们拟合的一些参数。

from sklearn.linear_model import LinearRegression # 导入线性回归模型
model = LinearRegression() # 定义模型
model.fit(X_train, y_train) # 训练模型
print("输出参数w:",model.coef_) # 输出模型参数w
print("输出参数b:",model.intercept_) # 输出参数b

输出结果:

输出参数w: [[1.4474774]]
输出参数b: [0.22557542]

模型测试与比较
可以看到线性回归拟合的参数是1.44和0.22,很接近实际的1.5和0.2,说明我们的算法性能还不错。 下面我们直接选取一批数据测试,然后通过画图看看算法模型与实际模型的差距。

X_test = np.linspace(0, 1, 100)
plt.plot(X_test, model.predict(X_test[:, np.newaxis]), label="Model")
plt.plot(X_test, true_fun(X_test), label="True function")
plt.scatter(X_train,y_train) # 画出训练集的点
plt.legend(loc="best")
plt.show()

在这里插入图片描述
由于我们的数据比较简单,所以从图中也可以看出,我们的算法拟合曲线与实际的很接近。对于更复杂以及高维的情况,线性回归不能满足我们回归的需求,这时候我们需要用到更为高级一些的多项式回归了。

多项式回归

多项式回归的思路一般是将 m m m次多项式方程转化为 m m m 线性回归方程,即将 y = b 0 + b 1 ∗ x + . . . + b m ∗ x m y=b_0+b_1∗x+...+b_m∗x^m y=b0+b1x+...+bmxm 转换为$ y = b 0 ∗ + b 1 ∗ x 1 + . . . + b m ∗ x m y=b_0∗+b_1∗x_1+...+b_m∗x_m y=b0+b1x1+...+bmxm(令 x m = x m x_m=x^m xm=xm 即可),然后使用线性回归的方法求出相应的参数。 一般实际的算法也是如此,我们将多项式特征分析器和线性回归串联,算出线性回归的参数之后倒推过去就行。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures # 导入能够计算多项式特征的类
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score

def true_fun(X): # 这是我们设定的真实函数,即ground truth的模型
    return np.cos(1.5 * np.pi * X)
np.random.seed(0)
n_samples = 30 # 设置随机种子

X = np.sort(np.random.rand(n_samples)) 
y = true_fun(X) + np.random.randn(n_samples) * 0.1

degrees = [1, 4, 15] # 多项式最高次
plt.figure(figsize=(14, 5))
for i in range(len(degrees)):
    ax = plt.subplot(1, len(degrees), i + 1)
    plt.setp(ax, xticks=(), yticks=())
    polynomial_features = PolynomialFeatures(degree=degrees[i],
                                             include_bias=False)
    linear_regression = LinearRegression()
    pipeline = Pipeline([("polynomial_features", polynomial_features),
                         ("linear_regression", linear_regression)]) # 使用pipline串联模型
    pipeline.fit(X[:, np.newaxis], y)
    print(f'degress: {degrees[i]}')
    print(f'参数1:{linear_regression.coef_}')
    print(f'参数2:{linear_regression.intercept_}')
    scores = cross_val_score(pipeline, X[:, np.newaxis], y,scoring="neg_mean_squared_error", cv=10) # 使用交叉验证
    X_test = np.linspace(0, 1, 100)
    plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Model")
    plt.plot(X_test, true_fun(X_test), label="True function")
    plt.scatter(X, y, edgecolor='b', s=20, label="Samples")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.xlim((0, 1))
    plt.ylim((-2, 2))
    plt.legend(loc="best")
    plt.title("Degree {}\nMSE = {:.2e}(+/- {:.2e})".format(
        degrees[i], -scores.mean(), scores.std()))
plt.show()

输出结果:
在这里插入图片描述
在这里插入图片描述
可以看出模型的复杂度越高,拟合数据的能力越强。

交叉验证

如果给定的样本数据充足,进行模型选择的一种简单的方法是随机地将数据集分为三部分,分别为训练集、验证集和测试集,训练集用来训练模型,验证集用于模型的选择,而测试集用于最终对学习方法的评估。在学习到的不同复杂度的模型中,选择对验证集有最小预测误差的模型。由于验证集有足够多的数据,用它对模型进行选择也是有效的。

但是在许多实际应用中数据是不充足的。为了选择好的模型,可以采用交叉验证方法。交叉验证的基本想法是重复地使用数据:把给定的数据进行切分,将切分的数据集组合为训练集与测试集,在此基础上反复地进行训练、测试以及模型的选择。

在本算法训练过程中,我们使用了一个技巧,就是交叉验证,类似的方法还有holdout检验以及自助法(交叉验证的升级版,即每次又放回去的选取数据)。 交叉验证法的作用就是尝试利用不同的训练集/测试集划分来对模型做多组不同的训练/测试,来应对测试结果过于片面以及训练数据不足的问题。过程如下图:
在这里插入图片描述
在我们训练完成一个模型后,需要验证这个模型的好坏,因此使用交叉验证的方式来评价模型。一般情况下根据超参数会生成多个模型,使用交叉验证可以对多个模型进行评价,得到多个模型的交叉验证结果,然后选择最好的结果作为最终模型。

逻辑回归

线性回归一样,需要求出 n 个参数: z = θ 0 + θ 1 x + θ 2 x + . . . + θ n x = θ T x z=\theta_0 + \theta_1 x + \theta_2x+...+\theta_nx=\theta^Tx z=θ0+θ1x+θ2x+...+θnx=θTx

逻辑回归通过Sigmoid函数引入了非线性因素,可以轻松处理二分类问题:
h θ ( x ) = g ( θ T x ) , g ( z ) = 1 1 + e − z h_\theta(x) = g(\theta^Tx), g(z)= \frac{1}{1+e^{-z}} hθ(x)=g(θTx),g(z)=1+ez1

与线性回归不同,逻辑回归使用的是交叉熵损失函数:

在这里插入图片描述
其梯度为:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值