python 机器学习写作_"深入浅出Python机器学习" 学习笔记-6

第四章 广义线性模型 - "耿直"的算法模型

这章主要介绍了线性模型, 怎么模拟直线, 线性回归, 岭回归, Lasso(套索)回归.不过这本书都不怎么讲数学, 原理基本不讲. 没有讲出线性回归, 岭回归, Lasso回归的本质差异, 需要额外补充资料学习.

这章主要用到sklearn.linear_model 模块:

linear_model模块

4.1 线性模型的基本模型

线性模型一般预测公式:

ŷ = w0 + ∑i=1~n (xi*wi)

其中w0也写作b, 截距. 而wi则是系数(斜率), 变量的权重值. |w|和b组成了线性模型的参数. ŷ 读作y-hat, 代表y的估计值. 则ŷ-y就是误差.

线性回归模型的损失函数

根据损失函数的不同, 线性模型有不同, 根据正则项λ∑w^2还是λ∑|w|, 可以分为岭回归还是Lasso回归, 前者又称L2正则化, 后者叫L1正则化.

线性模型的表示

显示线性函数其实就是先用np.linspace 构造一个自变量范围内的等差数列数组, 再用自变量数组代入线性方程, 将相应点plot出来:

import numpy as np

import matplotlib.pyplot as plt

# 构造一个等差数列, 覆盖自变量显示范围

x = np.linspace(-5,5,100)

# 输入线性方程

y = 0.5*x+3

# 画图显示

plt.plot(x,y,c='orange')

plt.title('Straight Line')

plt.show()

线性方程

其实np.linspace(-5,5,2) 都能把线显示出来, 1则不行. 其实这个是个线段, x范围[-5,5]. 因此要覆盖好你的范围.

如果利用两个点来构造直线呢? 构造线段可以直接plot出来:

plt.scatter([1,4],[3,5],s=80)

plt.plot([1,4],[3,5],c='orange')

plt.xlim(0, 6)

plt.ylim(0, 10)

plt.show()

过两点的线段

如果想在一定范围内显示好效果, 可以利用线性回归器构造:

from sklearn.linear_model import LinearRegression

# 输入两个点的坐标

X = [[1], [4]]

y = [3,5]

# 构造线性模型

lr = LinearRegression().fit(X,y)

# 构造一定范围的等差数列

xr = np.linspace(0,6,10)

# 画图

plt.scatter(X,y,s=80)

plt.plot(xr,lr.predict(xr.reshape(-1,1)),c='k')

plt.title('Straight Line by Linear Regression')

plt.show()

线性模型

显示线性模型的系数和系数可以用lr.coef_和lf.intercept_ 来进行, 前者实际是个数组, 储存了wi的值, 可以显示指定的系数

print('y = %.3f * x + %.3f' % (lr.coef_[0],lr.intercept_))

# y = 0.667 * x + 2.333

类似地, 可以对多个点进行回归和显示, 这里用上章的make_regression来构造. lr.score 所计算的就是决定系数(R2).

决定系数R2也可以使用metrics.r2_score(真值,估计值)来计算.

from sklearn.datasets import make_regression

# 构造数据集

X, y = make_regression(n_samples=50, n_features=1,n_informative=1,noise=30,random_state=1)

# 线性模型

reg = LinearRegression().fit(X,y)

# 用于画线性函数

xr = np.linspace(-3,3,200).reshape(-1,1)

plt.scatter(X,y,c='b',s=60)

plt.plot(xr, reg.predict(xr),c='k')

plt.title('Linear Regression Model')

plt.show()

# 显示方程

print('y = %.3f*x + %.3f' % (reg.coef_[0],reg.intercept_))

#> y = 83.851*x + 6.553

# 显示相关系数(R)和决定系数(R平方)

print('相关系数: %.3f ; 决定系数 %.3f' % (reg.score(X,y)**0.5,reg.score(X,y)))

#> 相关系数: 0.958 ; 决定系数 0.917

线性方程模型

如果是多元线性方程, 二维图不太便于显示, 仅显示其方程:

# 构造数据集

X, y = make_regression(n_samples=50, n_features=3,n_informative=1,noise=30,random_state=1)

# 线性模型

reg = LinearRegression().fit(X,y)

# 显示出方程

print('y = %.3f*x1 + %.3f*x2 + %.3f*x3 + %.3f' % tuple(list(reg.coef_)+[reg.intercept_]))

#> y = -9.596*x1 + 34.865*x2 + -7.491*x3 + 8.912

print('相关系数: %.3f ; 决定系数 %.3f' % (reg.score(X,y)**0.5,reg.score(X,y)))

#> 相关系数: 0.815*x ; 决定系数 0.664

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