sklearn实现多项式线性回归_一元/多元 【Python机器学习系列(八)】
ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞ
ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞ
大家好,我是侯小啾!
今天分享的内容是,通过python的sklearn机器学习库实现多项式线性回归。blog内容分为一元和多元两部分。欢迎大家访问!
自行准备一组数据,满足有两列可以做一元回归即可。读取数据并查看数据分布情况,代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import pandas as pd
df = pd.read_csv("data.csv")
features = [df.columns.values[1]]
# 获取数据
data = df.values
# 特征
x_data = data[1:, 1]
# 标签
y_data = data[1:, 2]
# 查看数据分布状况
plt.scatter(x_data, y_data)
plt.show()
绘制出散点图如下图所示:
以最高项为5次项为例,进行多元回归的建模,并绘制出曲线图。
# 将x_data转为二维数组
x_data = x_data[:, np.newaxis]
# 创建多项式对象,degree调节多项式的特征 5表示最高次项为5次项 x的5次方
poly_reg = PolynomialFeatures(degree=5)
# 数据转换 x0-->1 x1-->x x2-->x^2 x3-->x^3
x_poly = poly_reg.fit_transform(x_data)
# 建模
lin_reg = LinearRegression().fit(x_poly, y_data)
# 可视化
# 绘制x,y散点图
plt.scatter(x_data, y_data, color="r")
# 绘制x,y^曲线图
plt.plot(x_data, lin_reg.predict(x_poly))
plt.show()
因为选择的数据中样本相对较少,绘制出的曲线图如下图所示:
以DataFrame的形式输出系数,以及截距。代码如下所示:
point = poly_reg.get_feature_names(features)
coefs = lin_reg.coef_
inter = lin_reg.intercept_
combine = [*zip(point, coefs)]
sort_coef = pd.DataFrame(combine, columns=['features', 'coef'])
print(sort_coef)
print(inter)
输出结果:
做预测,以x=20为例,首先需要把测试的数据转为多项式格式。然后才能使用predict()方法。
test = poly_reg.fit_transform([[20]])
print(lin_reg.predict(test))
预测结果:
做完一元的多项式回归,接下来做多元的多项式回归。以最高项指定为4次项为例,使用内置的加利福尼亚房价数据集,代码示例如下:
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.datasets import fetch_california_housing as fch
from sklearn.preprocessing import PolynomialFeatures
# 读取数据集
house_value = fch()
x = pd.DataFrame(house_value.data)
y = house_value.target
# print(x.head())
# 将数据集进行多项式转化
poly = PolynomialFeatures(degree=4)
x_ = poly.fit_transform(x)
print(x_)
print(x.shape)
简单查看一下数据的结构,以便对后续代码的输出的理解。从下图可以看到,原始数据x中,共有8个特征,经过多项式转化后,特征数变为了495-1=494个。
# 对原始数据进行线性回归进行拟合
reg = LinearRegression().fit(x, y)
# 计算R^2
score = reg.score(x, y)
# 对多项式化数据集进行线性回归拟合
reg_ = LinearRegression().fit(x_, y)
# 获取R2指数
score_ = reg_.score(x_, y)
point = poly.get_feature_names(house_value.feature_names)
coef = reg_.coef_
combine = [*zip(point, coef)]
sort_coef = pd.DataFrame(combine, columns=['features', 'coef'])
print(sort_coef)
输出系数与截距结果如下图所示:
本次分享就到这里,小啾感谢您的关注与支持!
🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ