《Py机器学习》-广义线性模型

目录

        一. 本章使用的函数说明

        二. 四种线性模型

                1.最最基本线性模型

        2.线性回归模型

        3.岭回归

        4.套索回归

三. 模型的选择

一. 本章使用的函数说明

reshape( x )

 1.当原始数组A[4,6]为二维数组,代表4行6列。 A.reshape(-1,8):表示将数组转换成8列的数组,具体多少行我们不知道,所以参数设为-1。用我们的数学可以计算出是3行8列

2.当原始数组A[4,6]为二维数组,代表4行6列。 A.reshape(3,-1):表示将数组转换成3行的数组,具体多少列我们不知道,所以参数设为-1。用我们的数学可以计算出是3行8列

make_regression (n_samples=100, n_features=100, n_informative=10, n_targets=1, bias=0.0, effective_rank=None, tail_strength=0.5, noise=0.0, shuffle=True, coef=False, random_state=None)

用于生成随机样本

n_samples:样本数
n_features:特征数(自变量个数)
n_informative:参与建模特征数
n_targets:因变量个数
noise:噪音
bias:偏差(截距)
coef:是否输出coef标识
random_state:随机状态若为固定值则每次产生的数据都一样

train_test_split( train_data , train_target , test_size=0.4 ,  random_state=0 , stratify=y_train )

用于将数据分割成样本集和测试集

train_data:所要划分的样本特征集

train_target:所要划分的样本结果

test_size:样本占比,如果是整数的话就是样本的数量

random_state:是随机数的种子。

stratify是为了保持split前类的分布。比如有100个数据,80个属于A类,20个属于B类。如果train_test_split(... test_size=0.25, stratify = y_all), 那么split之后数据如下: 
training: 75个数据,其中60个属于A类,15个属于B类。 
testing: 25个数据,其中20个属于A类,5个属于B类。 

用了stratify参数,training集和testing集的类的比例是 A:B= 4:1,等同于split前的比例(80:20)。通常在这种类分布不平衡的情况下会用到stratify。

将stratify=X就是按照X中的比例分配 

将stratify=y就是按照y中的比例分配 

LinearRegression().fit( x,y )

用线性模型LinearRegression来拟合fit(输入,输出)。同理,将模型名称变成别的模型也是拟合

LinearRegression().fit().predict()

LinearRegression().fit().coef_

计算线性的直线系数w(模型的斜率k)。一个NumPy数组,数据中有几个特征值就对应几个数。.coef_[i] 表示数组中的第i个特征系数

LinearRegression().fit().intercept_

计算线性的截距b。一个浮点数

二. 四种线性模型

1.最最基本线性模型

        原理:直线会位于距离所有点距离最小的位置

        利用生成的数字

#添加插件部分
import numpy as np
import matplotlib.pyplot as plt
#数据部分
x = np.linspace(-5,5,100) #在-5到5之间生成100个等差数字
y = 0.5*x+3
#画图部分
plt.plot(x,y,c='green')
plt.show()

          再用给定两点的predict拟合

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression # 线性回归模型
#数据输入,x用[]括起来表示只有一个输入
x = [[1],[2]]
y = [5,3]
#创建一个线性模型LinearRegression,用这个线性模型拟合x,y  fit(x,y)
lr = LinearRegression().fit(x,y)
#定制图表的x上下界,和跨度(形成网格)
z = np.linspace(0,5,20)
#画图
plt.scatter(x,y,s=80)
plt.plot(z,lr.predict(z.reshape(-1,1)),c = 'k') #
plt.show()

        【注】在新版skelearn函数里,所有数据都应该是二维矩阵,哪怕它只是单独一行或一列,需要使用.reshape(1,-1)进行转换

        求取该直线的一些信息

        确定通过上述两点的直线方程:

print('y = {:.3f}'.format(lr.coef_[0]),'x','+{:.3f}'.format(lr.intercept_)) 

        求K和截距

print('直线的系数(k)值:{:.2f}'.format(lr.coef_[0]))
print('直线的截距:{:.2f}'.format(lr.intercept_))

      【注】.nf代表显示小数点后n位

2.线性回归模型

          普通最小二乘法模型(OLS)

          原理:找到训练集中y的预测值和其真实值的平方差最小的时候,所对应的w和b

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

X,y = make_regression(n_samples = 100,n_features = 2,n_informative = 2,random_state = 39)

X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=10)

lr = LinearRegression().fit(X_train,y_train)

print(lr.coef_)
print(lr.score(X_test,y_test))

          真实数据集再测试,导入糖尿病数据集:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_diabetes     #导入糖尿病数据集


X,y = load_diabetes().data,load_diabetes().target  #这里也不一样

X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=10)

lr = LinearRegression().fit(X_train,y_train)

print(lr.coef_)
print(lr.score(X_test,y_test))

        当出现训练数据集和测试数据集得分相差很多,或测试数据得分超过训练数据时,考虑出现了过拟合现象,应采用岭回归

3.岭回归

        一种改良的最小二乘法,线性回归的进阶版,L2正则法在线性模型中的应用

        L2正则法:保留全部变量,通过降低特征变量的系数来避免过拟合的方法

        岭回归原理:保留所有的特征变量。但是会减小特征变量的系数值。使得特征变量对结果的影响变小。岭回归中是通过改变alpha参数来控制减小特征变量系数的程度。岭回归是一个在[模型的简单性][训练集上的性能]取得平衡的一个模型,通过alpha参数可以调节二者间的倾向。alpha参数默认为1。alpha参数越高,特征变量系数越低,在训练集上的性能越低,泛化程度越高,过拟合程度越低。alpha参数越接近于0(例如0.1),会导致模型越趋近于线性回归。

        特殊作用:可以避免过拟合。如果我们希望模型的泛化能力更好,那么应该考虑岭回归模型,而非线性回归

        泛化:

        函数调用

from sklearn.linear_model import Ridge

        用岭回归重新测试同一个糖尿病数据集:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.datasets import load_diabetes     #导入糖尿病数据集


X,y = load_diabetes().data,load_diabetes().target

X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=10)

lr = Ridge().fit(X_train,y_train)  #换成岭回归函数

print(lr.coef_)
print(lr.score(X_test,y_test))

这次相差的就很小了

 调节alpha参数(影响训练集和测试集得分)

#alpha参数设为5
lr = Ridge(alpha=5).fit(X_train,y_train)

        当数据量小于50时,线性回归几乎没有用;如果数据量足够多(>300),岭回归与线性回归的学习效果相差无几

4.套索回归

        应用L1正则化进行回归的模型

        套索回归原理:在使用套索回归的时候,会将某些特征参数等于0,彻底被模型忽略,从而凸显出模型中的重要特征。可以视为模型自主选择的结果。

        用法:通过调节alpha参数和最大迭代次数max_iter参数,来提高纳入考虑的特征值数量,以及模型得分。其中,alpha参数默认为1,越接近0,模型越复杂,得分越高;但是如果alpha太小,太接近0,则会回到线性回归,出现过拟合现象。并非复杂程度越高,模型质量越好

        函数调用

from sklearn.linear_model import Lasso

        再使用套索回归一下糖尿病模型

import numpy as np  #引入个np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso  #导入Lasso套索回归
from sklearn.datasets import load_diabetes     #导入糖尿病数据集


X,y = load_diabetes().data,load_diabetes().target
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=10)
lr = Lasso().fit(X_train,y_train)  #应用Lasso

print("套索回归训练集得分:{:.2f}".format(lr.score(X_train,y_train)))
print("套索回归测试集得分:{:.2f}".format(lr.score(X_test,y_test)))
#用于检测套索回归使用了几个特征值
print("套索回归使用的特征数:{}".format(np.sum(lr.coef_ != 0)))

         拟合结果不理想,10个特征值只用了2个,说明发生欠拟合。

         降低alpha的值,并且增加最大迭代次数,来降低欠拟合程度:

lr = Lasso(alpha=0.1 , max_iter=100000 ).fit(X_train,y_train)

        发现特征数变多了,并且得分明显提高,nice。

         但是注意此处出现了过拟合现象

三. 模型的选择

        岭回归(L2正则化)的应用场景

                1. 数据的特征向量不多,而且每一个都比较重要

                2. 往往是优选

        套索回归(L1正则化)的应用场景

                1.有很多种特征,并且有一些特征很不必要

                2. 需要对模型进行解释(更少的特征会方便解释,容易理解)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值