Python机器学习实践(三)监督学习篇1(线性模型--回归)

Python机器学习 学习笔记与实践
环境:win10 + Anaconda Python3.8
该篇总结各类监督学习算法的实践使用方法

注:mglearn库在这个版本的Anaconda中没有,需要自己安装一下。步骤:打开Anaconda Prompt -->输入“pip install mglearn”,然后回车–>完成后输入“conda list”查看是否安装成功。

1、线性回归(普通最小二乘法)

首先对于最简单的情况,即对每个样本只有一个特征的数据集使用该算法,从而直观地理解。
完整代码如下:

import mglearn
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
#产生数据集
X,y=mglearn.datasets.make_wave(n_samples=60)
#观察数据集
plt.scatter(X,y,c="g",s=6)
#将数据集分为训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
#训练模型
lr=LinearRegression()
lr.fit(X_train,y_train)
#查看线性模型的斜率和截距
print('模型斜率为: {} '.format(lr.coef_))
print('模型截距为: {} '.format(lr.intercept_))
#评价模型性能
print('Score of training set is : {}'.format(lr.score(X_train,y_train)))
print('Score of testing set is : {}'.format(lr.score(X_test,y_test)))
#用图来观察模型
x0=np.linspace(-3,3,100)
y0=lr.coef_*x0+lr.intercept_
plt.plot(x0,y0)
plt.show()

输出结果:

在这里插入图片描述

在这里插入图片描述
(1)mglearn.datasets.make_wave方法定义如下:

def make_wave(n_samples=100):
	rnd = np.random.RandomState(42)
	x = rnd.uniform(-3, 3, size=n_samples)
	y_no_noise = (np.sin(4 * x) + x)
	y = (y_no_noise + rnd.normal(size=len(x))) / 2
	return x.reshape(-1, 1), y

(2)“lr=LinearRegression()” 不要忘记括号,若无括号,运行时将报错:
“fit() missing 1 required positional argument: ‘y’” 。

(3)score()函数返回的是模型对括号内参数的拟合程度的评价,越接近1,则拟合程度越高。

(4)我们可以看到,模型在训练集和测试集上的得分比较接近,这说明也能欠拟合了,没有完全地提取到训练数据的特征。

(5)标准线性回归无法控制复杂度,因而对于过拟合的处理比较无力,因此常用岭回归替代。

2、岭回归

岭回归的思想是使得线性模型的斜率尽量的小,即接近于0,使得X对y的影响达到最小。同时,模型不只要拟合训练集,还要拟合给定的约束条件,这种约束也叫“正则化”岭回归用到的是L2正则化。

A、首先我们先直观的看看过拟合。用上面的标准线性回归模型对经典数据集“extended_boston”即经过扩展的波士顿房价数据集的应用。该数据集有506个样本,每个样本x有105个特征,目标是y是房价。
修改代码如下:

import mglearn
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
#产生数据集
X,y=mglearn.datasets.load_extended_boston()

#观察数据集
print('The shape of extended_boston\'s data is : {}'.format(X.shape))
print('The shape of extended_boston\'s target is : {}'.format(y.shape))

#将数据集分为训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=6)

#训练模型
lr=LinearRegression()
lr.fit(X_train,y_train)

#评价模型性能
print('Score of training set is : {:.2f}'.format(lr.score(X_train,y_train)))
print('Score of testing set is : {:.2f}'.format(lr.score(X_test,y_test)))

运行结果为:
在这里插入图片描述
我们可以看到,这个时候虽然模型可以在训练集上取得不错的分数,但在测试集上的效果与其差距太大,这就很可能发生了过拟合。

B、接下来我们观察岭回归对同样数据集的性能。
修改代码,将A中代码的"LinearRegression"换成“Ridge”。
运行结果如下:
在这里插入图片描述
可见,虽然岭回归相对于标准线性回归来说,在训练集上的性能有所降低,但其在测试集上的性能提升了,可以说一定程度上缓解了过拟合的问题。在此例当中,使用岭回归模型时默认参数alpha为1,这个参数越大,则约束程度越高,模型的斜率越接近0。如果我们尝试让alpha接近于0,例如0.01,我们再来看一看模型的性能:
在这里插入图片描述
此时表明约束程度很小,自然模型的性能就与标准线性回归的性能接近了。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值