python机器学习---监督学习---线性回归模型(用于回归)

目录

1、线性模型基本原理

1.1 线性模型一般公式

1.2 线性模型图形表示

2、线性模型分类及模型实现​

3、线性模型的优缺点


备注:本文主要来自于对《深入浅出python机器学习》书籍的学习总结笔记,感兴趣的同学可以购买本书学习

1、线性模型基本原理

1.1 线性模型一般公式

python机器学习---监督学习---线性回归模型(用于回归)_第1张图片

线性模型在拟合数据集时,会让自己距离每个数据点的加和为最小值,即找到找到训练数据集中y的预测值和真实值的平方差的最小值,这也是线性回归模型的基本原理,线性回归也称为最小二乘法。

使用线性模型的前提条件,是假设目标y是数据特征的线性组合。

1.2 线性模型图形表示

##1-数据准备
#导入sklearn.datasets的make_regression数据集
from sklearn.datasets import make_regression
X, y = make_regression(n_samples=50, n_features=1, n_informative=1,
                       noise=50,random_state=1)

##2-数据建模
#导入算法包
from sklearn.linear_model import LinearRegression
#使用算法
reg = LinearRegression()
#模型训练
reg.fit(X,y)
#绘制拟合图
%matplotlib inline
import matplotlib.pyplot as plt
plt.scatter(X,y,c='b',s=60)

##3-模型应用
#导入待预测数据
import numpy as np
z = np.linspace(-3,3,200).reshape(-1,1)
plt.plot(z, reg.predict(z),c='k')
plt.title('Linear Regression')
#打印线性方程
print('直线的斜率是:{:.2f}'.format(reg.coef_[0]))
print('直线的截距是:{:.2f}'.format(reg.intercept_))

python机器学习---监督学习---线性回归模型(用于回归)_第2张图片

2、线性模型分类及模型实现

用于回归分析的线性模型有很多种类,这些模型之间的区别在于如何从训练数据中确定模型参数w和b,以及如何控制模型复杂度。下面主要介绍一般线性回归,岭回归和套索回归。

(1 )一般线性回归

一般线性回归也称为普通最小二乘法,没有提供可供用户调节的参数,这是它的优势,但是也就无法控制模型的复杂度。下面用来自真实世界的数据集---糖尿病情数据集。需要导入from sklearn.linear_model import LinearRegression

(2 )岭回归(用L2正则化的线性模型)

岭回归是一种改良的最小二乘法,模型会保留所有的特征变量,但是会减小特征变量的系数值,让特征变量对预测结果的影响变小。它是通过改变alpha参数来控制减小特征变量系数的程度。而这种保留全部变量特征变量,只是降低特征变量系数值来避免过度拟合的方法,称为L2正则化。需要导入from sklearn.linear_model import Ridge

岭回归参数调节:alpha越小表示会让系数限制变得不那么严格,当alpha非常小是,那么系统的限制几乎可以忽略不计,得到的结果也会非常接近线性回归;alpha越高表示系数限制更严格,提高alpha值一般来说可以降低模型过拟合的程度。

(3) 套索回归(用L1正则化的线性模型)

和岭回归一样,套索回归也会将系数限制在非常接近0范围,但它进行限制的方法不太一样。它会使的一部分特征的系数正好等于0,也就是说,有一些特征会彻底被模型忽略掉。这种称为L1正则化。

套索回归的参数调节:套索回归主要有两个参数需要调节,一个是alpha参数,另一个是最大迭代次数max_iter.

算法案例---糖尿病数据的预测

##1-数据准备
#导入sklearn.datasets的load_diabetes数据集
from sklearn.datasets import load_diabetes
#导入的数据集是一种Bunch对象,它包括键keys和数值values,它有点类似字典,可用类似字段的方法查看信息
#获取字典的信息-获取字典的键dict.keys(),获取字典的值-dict.values(),获取字典的键值-dict.items(),获取特定键的值dict['键名']
diabetes = load_diabetes()
#获取字典的键dict.keys()
print(diabetes.keys())    #糖尿病数据集跟之前的酒数据集一样,包含数据,目标分类、分类名,详细信息,数据的特征名,文件位置
print('\n')
#获取特定键的值dict['键名']
print('data的分类:',diabetes['target'])
print('\n')
print('data的特征:',diabetes['feature_names'])

##2-数据建模---模型训练/测试
#2.1将数据拆分为训练集和测试集---要用train_test_split模块中的train_test_split()函数,随机将75%数据化道训练集,25%数据到测试集
#导入数据集拆分工具
from sklearn.model_selection import train_test_split
#将数据集的数值和分类目标赋值给x,y
x,y=diabetes['data'],diabetes['target']
#拆分数据集---x,y都要拆分,rain_test_split(x,y,random_state=0),random_state=0使得每次生成的伪随机数不同
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=0)
#查看拆分后的数据集大小情况
print('x_train_shape:{}'.format(x_train.shape))
print('x_test_shape:{}'.format(x_test.shape))
print('y_train_shape:{}'.format(y_train.shape))
print('y_test_shape:{}'.format(y_test.shape))

##2、数据建模---模型训练/测试---线性回归/岭回归/套索回归算法
#2.2 模型训练---算法.fit(x_train,y_train)
#导入算法包
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
#使用算法
lr = LinearRegression() 
ridge=Ridge(alpha=0.5)
lasso=Lasso(alpha=0.5,max_iter=1000000)
#算法.fit(x,y)对训练数据进行拟合
print(lr.fit(x_train, y_train))
print(ridge.fit(x_train, y_train))
print(lasso.fit(x_train, y_train))
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
         normalize=False)
Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
   normalize=False, random_state=None, solver='auto', tol=0.001)
Lasso(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=1000000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
##2、数据建模---拆分数据集/模型训练/测试---线性回归/岭回归/套索回归算法
#2.3 模型测试---算法.score(x_test,y_test)
#线性回归测试
score_test_lr=lr.score(x_test,y_test)
score_train_lr=lr.score(x_train,y_train)
print('test_score_lr:{:.2%}'.format(score_test_lr))
print('train_score_lr:{:.2%}'.format(score_train_lr))
#岭回归测试
score_test_ridge=ridge.score(x_test,y_test)
score_train_ridge=ridge.score(x_train,y_train)
print('test_score_ridge:{:.2%}'.format(score_test_ridge))
print('train_score_ridge:{:.2%}'.format(score_train_ridge))
#套索回归测试
score_test_lasso=lasso.score(x_test,y_test)
score_train_lasso=lasso.score(x_train,y_train)
print('test_score_lasso:{:.2%}'.format(score_test_lasso))
print('train_score_lasso:{:.2%}'.format(score_train_lasso))
print("套索回归使用的特征数:{}".format(np.sum(lasso.coef_ != 0)))  #打印套索回归使用特征数
test_score_lr:35.94%
train_score_lr:55.54%
test_score_ridge:37.80%
train_score_ridge:51.17%
test_score_lasso:32.89%
train_score_lasso:49.93%
套索回归使用的特征数:4

从一般线性结果可以看出,由于真实世界的数据复杂度比较高,以及线性回归自身的特点,容易出现过拟合的现象(训练集得分与测试集得分之间存在的巨大差异是出现过拟合的明确信号)。
通过参数调节,岭回归和套索回归会在一定程度上降低过拟合的现象

python机器学习---监督学习---线性回归模型(用于回归)_第3张图片

3、线性模型的优缺点

python机器学习---监督学习---线性回归模型(用于回归)_第4张图片

 

 

你可能感兴趣的:(python机器学习)