【sklearn实例】3--线性回归

本文深入探讨线性回归的原理及应用,包括损失函数的选择、优化方法如梯度下降和正规方程,以及如何防止过拟合的技术如岭回归、Lasso和ElasticNet。通过sklearn库的实例演示,展示如何在波士顿房价数据集上进行线性回归分析,包括模型训练、交叉验证和参数调整。

线性回归思想

通过学习,找到属性的线性组合来预测输出标记。
在这里插入图片描述

损失函数

一般采用均方误差作为损失函数:
在这里插入图片描述

优化方法

  • 梯度下降法(不满秩情况使用,收敛较慢,有可能求得局部最小值)
    在这里插入图片描述
  • 正规方程求解-最小二乘法(需要X是满秩的,即样本数大于特征数)
    在这里插入图片描述

形式

  • 一般线性回归
  • 岭回归(Ridge):防止过拟合,损失函数加入正则化项,L2范数
    在这里插入图片描述
  • lasso:加入正则化项,L1范数
    在这里插入图片描述
  • ElasticNet:L1和L2范数混合
    在这里插入图片描述

评价

LR.score()
在这里插入图片描述

sklearn 实现

  • 1 简单使用
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 载入波士顿房价数据库
bostondata=datasets.load_boston()
X=bostondata.data
Y=bostondata.target

#划分测试集和训练集
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)
LR=LinearRegression()
LR.fit(x_train,y_train)
print '系数',LR.coef_
print '截距',LR.intercept_
print '测试集得分',LR.score(x_test,y_test)
print '训练集得分',LR.score(x_train,y_train)
y_pred=LR.predict(x_test)
plt.scatter(y_test,y_pred,c='r',marker='o')
plt.scatter(y_test,y_test,c='g',marker='+')
plt.show()

在这里插入图片描述

分析

  • 线性回归的基本用法,score即r2评价指标;
  • 可视化:本来想画出拟合曲线,但是这里有13个特征,只有一个特征的时候,才能够画出y和x的拟合曲线。所以这里横坐标都采用y_test,纵坐标分布采用预测值和y_test,画出散点图。如果预测值越接近中间的直线即真实值,说明预测效果越好。
  • 2 使用交叉验证
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
bostondata=datasets.load_boston()
X=bostondata.data
Y=bostondata.target
#x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)
LR=LinearRegression()
#LR.fit(x_train,y_train)
#print LR.score(x_test,y_test)
#print LR.score(x_train,y_train)

#交叉验证方法查看规律
scores=[]
score=cross_val_score(LR,X,Y,cv=10,scoring='r2')
print score,score.mean() 

在这里插入图片描述

分析:

  • 采用交叉验证,可以看出,每次训练的模型在测试集上都有不同的表现,好的0.7,坏的还有负的,所以最后平均下来才0.2。这也是采用交叉验证的意义所在,不受单次划分训练和测试集的特殊性影响,看平均得分情况,在调参时会更有效。
  • 交叉验证时候,评价标准有多种类型,默认为accuracy,分类时候适用,本例中选用r2,与线性回归中的score评价相同,适合回归。还有mean_squared_error/mean_absolute_error等。
  • 3 Ridge-单次划分训练集测试集,查看参数影响规律alpha(是不能用于调参的)
from sklearn import datasets
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.cross_validation import cross_val_score
bostondata=datasets.load_boston()
X=bostondata.data
Y=bostondata.target
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)

#改变参数值,查看规律
a_range=np.arange(1,100,1)
score_test=[]
score_train=[]
for a in a_range:
    LR=Ridge(alpha=a)
    LR.fit(x_train,y_train)
    score_test.append(LR.score(x_test,y_test))
    score_train.append(LR.score(x_train,y_train))
plt.plot(a_range,score_train,c='g')
plt.plot(a_range,score_test,c='r')
plt.show()

在这里插入图片描述
再运行会变成这样
在这里插入图片描述

发现每次运行后,规律都不一样,分析:

  • 因为每一次运行时划分的测试集和训练集都不一样,所以每次运行后即便alpha相同,两次对应的测试集却不同,所以才会发现规律都不一样。
  • 先split好测试集和训练集,通过改变alpha,查看测试集(训练集)的分数,这样得到的关于参数alpha的影响规律不具有普适性,因为不同参数对应的模型的测试集都不一样,这样的规律只是片面地评价了相应测试集,结果具有特殊性。
  • 要探究参数的影响规律,应该采用交叉验证的方法,通过遍历所有训练集得到模型来评价相对应的测试集,查看平均得分,才可得到普适性规律,对调参才具有意义。
  • 4 通过交叉验证来查看参数的影响规律
a_range=np.arange(0.1,100,0.1)
scores=[]
for a in a_range:
    LR=Ridge(alpha=a)
    score=cross_val_score(LR,X,Y,cv=10,scoring='r2')
    scores.append(score.mean())
print scores  
plt.plot(a_range,scores,c='r')
plt.show()

在这里插入图片描述

分析

  • 利用交叉验证法,得到的评分才是参数对整个测试集的平均影响,规律才具有普适性。
  • 可以看出,alpha越大,正则化影响越大,模型越简单,泛化性能越好,在40左右预测性能达到最好,但是40之后又开始变差,可能是因为此时模型过于简单导致预测能力下降。
### 使用Sklearn逻辑回归实现手写数字识别 #### 加载数据集并预处理 为了使用逻辑回归模型对手写数字进行分类,首先需要加载Scikit-Learn库中内置的手写数字数据集。该数据集中包含了1797张8×8大小的手写数字图像,这些图像已经被转换成长度为64的一维特征向量[^3]。 ```python from sklearn.datasets import load_digits import numpy as np # 加载数据集 digits = load_digits() X, y = digits.data, digits.target ``` #### 划分训练集和测试集 将整个数据集划分为两部分:一部分用于训练模型,另一部分用来评估模型性能。通常情况下会按照一定比例划分这两者之间的界限。 ```python from sklearn.model_selection import train_test_split # 将数据随机分成训练集(70%) 和 测试集 (30%) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` #### 训练逻辑回归模型 创建一个逻辑回归实例,并通过调用`fit()`方法来拟合给定的数据。由于逻辑回归对于线性可分离问题具有良好的表现并且能够快速完成计算,因此非常适合此类任务[^1]。 ```python from sklearn.linear_model import LogisticRegression logistic_regressor = LogisticRegression(max_iter=10000) # 开始训练过程 logistic_regressor.fit(X_train, y_train) ``` #### 预测与评价 利用已经训练好的模型对未知样本做出预测,并通过混淆矩阵等方式衡量其准确性。 ```python predictions = logistic_regressor.predict(X_test) print(f'Accuracy of the model is {metrics.accuracy_score(y_test,predictions)}') confusion_matrix = metrics.confusion_matrix(y_test, predictions) plt.figure(figsize=(9, 9)) sns.heatmap(confusion_matrix, annot=True, fmt=".3f", linewidths=.5, square=True, cmap='Blues_r'); plt.ylabel('Actual label'); plt.xlabel('Predicted label'); all_sample_title = 'Confusion Matrix' plt.title(all_sample_title, size=15); plt.show() ``` 上述代码展示了如何基于Scikit-Learn框架构建一个简单的逻辑回归算法来进行多类别(即多位数)的手写字符识别工作流程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值