广义线性模型

常用的线性模型包括 :  线性回归,岭回归,套索回归,逻辑回归,线性SVC

1.线性模型图

import numpy as np
import matplotlib.pyplot as plt
#令x为-5到5之间,元素数为100的等差数列
x = np.linspace(-5,5,100)
#输入直线方程
y = 0.5*x + 3
plt.plot(x,y,c='orange')
#图题设为"Straight Line"
plt.title('Straight Line')
plt.show()

#导入线性回归模型
from sklearn.linear_model import LinearRegression
#输入两个点的横坐标
X = [[1],[4]]
#输入两个点的纵坐标
y = [3,5]
#用线性模型拟合这两个点
lr = LinearRegression().fit(X,y)
#画出两个点和直线的图形
z = np.linspace(0,5,20)
plt.scatter(X,y,s=80)
plt.plot(z,lr.predict(z.reshape(-1,1)),c='k')
#设定图题为Straight Line
plt.title('Straight Line')
#将图片显示出来
plt.show()

#对数据点分裂进行判断
print('\n\n\n')
print('直线方程为:')
print('====================================')
print('y={:.3f}'.format(lr.coef_[0]),'x','+ {:.3f}'.format(lr.intercept_))
print('====================================')
print('\n\n\n')
直线方程为:
====================================
y=0.667 x + 2.333
====================================
#输入3个点的横坐标
X = [[1],[4],[3]]
#输入3个点纵坐标
y = [3,5,3]
#用线性模型拟合这3个点
lr = LinearRegression().fit(X,y)
#画出2个点和直线的图形
z = np.linspace(0,5,20)
plt.scatter(X,y,s=80)
plt.plot(z,lr.predict(z.reshape(-1,1)),c='k')
#设定图题为Straight Line
plt.title('Straight Line')
#将图片显示出来
plt.show()

#对数据点分裂进行判断
print('\n\n\n')
print('直线方程为:')
print('====================================')
print('y={:.3f}'.format(lr.coef_[0]),'x','+ {:.3f}'.format(lr.intercept_))
print('====================================')
print('\n\n\n')
直线方程为:
====================================
y=0.571 x + 2.143
====================================
from sklearn.datasets import make_regression
#生成用于回归分析的数据集
X,y = make_regression(n_samples=50,n_features=1,n_informative=1,noise=50,random_state=1)
#使用线性模型对数据进行拟合
reg = LinearRegression()
reg.fit(X,y)
#z是我们生成的等差数列,用来画出线性模型的图形
z = np.linspace(-3,3,200).reshape(-1,1)
plt.scatter(X,y,c='b',s=60)
plt.plot(z,reg.predict(z),c='k')
plt.title('Linear Regression')

#对数据点分裂进行判断
print('\n\n\n')
print('代码运行结果为:')
print('====================================')
#打印直线的系数和截距
print('直线的系数是:{:.2f}'.format(reg.coef_[0]))
print('直线的截距是:{:.2f}'.format(reg.intercept_))
print('====================================')
print('\n\n\n')
代码运行结果为:
====================================
直线的系数是:79.52
直线的截距是:10.92
====================================

2.线性回归模型

#############################  最基本的线性模型--线性回归 #######################################
#导入数据集拆分工具
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=38)
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=8)
lr = LinearRegression().fit(X_train,y_train)
print('\n\n\n')
print('代码运行结果为:')
print('====================================')
print('lr.coef_:{}'.format(lr.coef_[:]))
print('lr.intercept:{}'.format(lr.intercept_))
print('====================================')
print('\n\n\n')
代码运行结果为:
====================================
lr.coef_:[70.38592453  7.43213621]
lr.intercept:-1.4210854715202004e-14
====================================
print('\n\n\n')
print('代码运行结果为:')
print('====================================')
#打印直线的系数和截距
print('训练数据集得分:{:.2f}'.format(lr.score(X_train,y_train)))
print('测试数据集得分:{:.2f}'.format(lr.score(X_test,y_test)))
print('====================================')
print('\n\n\n')
代码运行结果为:
====================================
训练数据集得分:1.00
测试数据集得分:1.00
====================================
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=8)
#使用线性回归模型进行拟合
lr = LinearRegression().fit(X_train,y_train)
print('\n\n\n')
print('代码运行结果为:')
print('====================================')
#打印直线的系数和截距
print('训练数据集得分:{:.2f}'.format(lr.score(X_train,y_train)))
print('测试数据集得分:{:.2f}'.format(lr.score(X_test,y_test)))
print('====================================')
print('\n\n\n')
代码运行结果为:
====================================
训练数据集得分:0.53
测试数据集得分:0.46
====================================

3.L2正则化的线性模型--岭回归

  岭回归实际上是一种能够避免过拟合的线性模型,在岭回归中,模型会保留所有的特征变量,但是会减小特征变量的系数值,让特征变量对预测结果的影响变小,这种保留全部特征变量,只是降低特征变量的系数值来避免过拟合的方法,即岭回归.

#############################  L2正则化的线性模型--岭回归 #######################################
#导入岭回归
from sklearn.linear_model import Ridge
#使用岭回归对数据进行拟合
ridge = Ridge().fit(X_train,y_train)
print('\n\n\n')
print('代码运行结果为:')
print('====================================')
#打印直线的系数和截距
print('岭回归的训练数据集得分:{:.2f}'.format(ridge.score(X_train,y_train)))
print('岭回归的测试数据集得分:{:.2f}'.format(ridge.score(X_test,y_test)))
print('====================================')
print('\n\n\n')
代码运行结果为:
====================================
岭回归的训练数据集得分:0.43
岭回归的测试数据集得分:0.43
====================================
#修改alpha参数为10
ridge10 = Ridge(alpha=10).fit(X_train,y_train)
print('\n\n\n')
print('代码运行结果为:')
print('====================================')
#打印直线的系数和截距
print('岭回归的训练数据集得分:{:.2f}'.format(ridge10.score(X_train,y_train)))
print('岭回归的测试数据集得分:{:.2f}'.format(ridge10.score(X_test,y_test)))
print('====================================')
print('\n\n\n')
代码运行结果为:
====================================
岭回归的训练数据集得分:0.15
岭回归的测试数据集得分:0.16
====================================
#修改alpha参数为0.1
ridge01 = Ridge(alpha=0.1).fit(X_train,y_train)
print('\n\n\n')
print('代码运行结果为:')
print('====================================')
#打印直线的系数和截距
print('岭回归的训练数据集得分:{:.2f}'.format(ridge01.score(X_train,y_train)))
print('岭回归的测试数据集得分:{:.2f}'.format(ridge01.score(X_test,y_test)))
print('====================================')
print('\n\n\n')
代码运行结果为:
====================================
岭回归的训练数据集得分:0.52
岭回归的测试数据集得分:0.47
====================================
#绘制alpha=1时的模型系数
plt.plot(ridge.coef_,'s',label = 'Ridge alpha=1')
#绘制alpha=10时的模型系数
plt.plot(ridge10.coef_,'^',label = 'Ridge alpha=10')
#绘制alpha=1时的模型系数
plt.plot(ridge01.coef_,'v',label = 'Ridge alpha=0.1')
#绘制线性回归的系数作为对比
plt.plot(lr.coef_,'o',label = 'linear regression')
plt.xlabel("coefficient index")
plt.ylabel("coefficient magnitude")
plt.hlines(0,0,len(lr.coef_))
plt.legend()

from sklearn.model_selection import learning_curve,KFold
#定义一个绘制学习曲线的函数
def plot_learning_curve(est,X,y):
    #将数据进行20次拆分用来对模型进行评分
    training_set_size,train_scores,test_scores = learning_curve(est,X,y,train_sizes=np.linspace(.1,1,20),cv=KFold(20,shuffle=True,random_state=1))
    estimator_name = est.__class__.__name__
    line = plt.plot(training_set_size,train_scores.mean(axis=1),'--',label="training" + estimator_name)
    plt.plot(training_set_size,test_scores.mean(axis=1),'-',label="test" + estimator_name,c=line[0].get_color())
    plt.xlabel('Training set size')
    plt.ylabel('Score')
    plt.ylim(0,1.1)

plot_learning_curve(Ridge(alpha=1),X,y)
plot_learning_curve(LinearRegression(),X,y)
plt.legend(loc=(0,1.05),ncol=2,fontsize=11)

4.L1正则化的线性模型--套索回归

  套索回归是将系数限制在非常接近于0的范围内,但是其进行限制的方式我们称之为L1正则化,

  L1正则化 : 就是我们使用套索回归时,有一部分特征的系数正好等于0,即有一些特征会彻底被模型忽略掉,这也是模型对于特征进行自动选择的一种方式,

#############################  L1正则化的线性模型--套索回归 #######################################
#导入岭回归
from sklearn.linear_model import Lasso
#使用岭回归对数据进行拟合
lasso = Lasso().fit(X_train,y_train)
print('\n\n\n')
print('代码运行结果为:')
print('====================================')
#打印直线的系数和截距
print('套索回归的训练数据集得分:{:.2f}'.format(lasso.score(X_train,y_train)))
print('套索回归的测试数据集得分:{:.2f}'.format(lasso.score(X_test,y_test)))
print('套索回归使用的特征集:{}'.format(np.sum(lasso.coef_!=0)))
print('====================================')
print('\n\n\n')
代码运行结果为:
====================================
套索回归的训练数据集得分:0.36
套索回归的测试数据集得分:0.37
套索回归使用的特征集:3
====================================
#增加最大迭代次数的默认设置
#否则模型会提示我们增加最大跌打次数
lasso01 = Lasso(alpha=0.1,max_iter=100000).fit(X_train,y_train)
print('\n\n\n')
print('代码运行结果为:')
print('====================================')
print('alpha=0.1时套索回归在训练数据集的得分:{:.2f}'.format(lasso01.score(X_train,y_train)))
print('alpha=0.1时套索回归在测试数据集得分:{:.2f}'.format(lasso01.score(X_test,y_test)))
print('alpha=0.1时套索回归使用的特征数:{}'.format(np.sum(lasso01.coef_!=0)))
print('====================================')
print('\n\n\n')
代码运行结果为:
====================================
alpha=0.1时套索回归在训练数据集的得分:0.52
alpha=0.1时套索回归在测试数据集得分:0.48
alpha=0.1时套索回归使用的特征数:7
====================================
#修改alpha值为0.0001
lasso00001 = Lasso(alpha=0.0001,max_iter=100000).fit(X_train,y_train)
print('\n\n\n')
print('代码运行结果为:')
print('====================================')
print('alpha=0.0001时套索回归在训练数据集的得分:{:.2f}'.format(lasso00001.score(X_train,y_train)))
print('alpha=0.0001时套索回归在测试数据集得分:{:.2f}'.format(lasso00001.score(X_test,y_test)))
print('alpha=0.0001时套索回归使用的特征数:{}'.format(np.sum(lasso00001.coef_!=0)))
print('====================================')
print('\n\n\n')
代码运行结果为:
====================================
alpha=0.0001时套索回归在训练数据集的得分:0.53
alpha=0.0001时套索回归在测试数据集得分:0.46
alpha=0.0001时套索回归使用的特征数:10
====================================
#绘制alpha=1时的模型系数
plt.plot(lasso.coef_,'s',label = 'Lasso alpha=1')
#绘制alpha=10时的模型系数
plt.plot(lasso01.coef_,'^',label = 'Lasso alpha=0.1')
#绘制alpha=1时的模型系数
plt.plot(lasso00001.coef_,'v',label = 'Lasso alpha=0.0001')
#绘制线性回归的系数作为对比
plt.plot(ridge01.coef_,'o',label = 'Ridge alpha=0.1')
plt.legend(ncol=2,loc=(0,1.05))
plt.ylim(-1050,800)
plt.xlabel("coefficient index")
plt.ylabel("coefficient magnitude")

总结:

  线性回归,岭回归和套索回归是通过alpha参数来进行调节的.

  逻辑回归(逻辑斯蒂回归),线性SVC(线性支持向量机)是通过参数C来调节的.

 

  选择L1正则化模型还是L2正则化模型?

  原则 :  如果数据集有很多特征,而这些特征中并不是每一个都对结果有重要影响,那么就选L1正则化模型(如:套索回归)

        如果数据集中的特征本来就不多,而且每一个都有重要作用的化,就选L2正则化模型(如:岭回归)

  我们使用线性模型是因为其训练模型的速度非常快,尤其针对那些超大型数据集来讲.相反,当数据集的特征较少时,线性模型的表现会相对的偏弱,这是我们可以进行数据预处理(数据升维),来提高线性模型的准确率.

 

文章引自:《深入浅出python机器学习》

转载于:https://www.cnblogs.com/weijiazheng/p/10870605.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值