在利用线性回归进行预测时,经常由于数据的线性关系不好,导致模型出现欠拟合,lr。score比较低,就是决定系数低,这时候我们可以用多项式拓展方式来改进、
多项式扩展,可以认为是对现有数据进行的一种转换,通过将数据映射到更高维度的空间中,该模型就可以拟合更广泛的数据。
需注意:多项式拟合的应用,仍然变为线性模型
下面是多项式拓展的实现
# 引入所需要的全部包
import sklearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import time
## 创建一个时间字符串格式化字符串,
def date_format(dt):
import time
t = time.strptime(' '.join(dt), '%d/%m/%Y %H:%M:%S')
return (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)
## 设置字符集,防止中文乱码
mpl.rcParams['font.sans-serif']=[u'Arial Unicode MS']
mpl.rcParams['axes.unicode_minus']=False
# 加载数据
path = /datas/household_power_consumption_1000.txt' ## 1000行数据
df = pd.read_csv(path, sep=';', low_memory=False)
# 日期、时间、有功功率、无功功率、电压、电流、厨房用电功率、洗衣服用电功率、热水器用电功率
names2=df.columns
names=['Date', 'Time', 'Global_active_power', 'Global_reactive_power', 'Voltage', 'Global_intensity', 'Sub_metering_1', 'Sub_metering_2', 'Sub_metering_3']
# 异常数据处理(异常数据过滤)
new_df = df.replace('?', np.nan)
datas = new_df.dropna(axis=0,how = 'any') # 只要有数据为空,就进行删除操作
## 时间和电压之间的关系(Linear)
# 获取x和y变量, 并将时间转换为数值型连续变量
X = datas[names[0:2]]
X = X.apply(lambda x: pd.Series(date_format(x)), axis=1)
Y = datas[names[4]].values
# 对数据集进行测试集合训练集划分
X_train,X_test,Y_train,Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
# 数据标准化, 第一步:进行标准化操作
ss = StandardScaler()
X_train = ss.fit_transform(X_train) # 训练并转换
X_test = ss.transform(X_test) ## 直接使用在模型构建数据上进行一个数据标准化操作
# 多项式扩展,第二步:进行多项式扩展 比较不同阶的多项式拓展的决定系数
for i in range(1,5,1):
print(i)
print(X_train.shape)
poly = PolynomialFeatures(degree=i, interaction_only=True)#true代表不进行x1^2或者x1^2*x2类型的拓展
train1 = poly.fit_transform(X_train)
test1 = poly.transform(X_test)
print(poly.n_output_features_)
print(train1.shape)
# 模型训练, 第三步:进行模型训练
linear = LinearRegression(fit_intercept=False)
linear.fit(train1, Y_train)
print(linear.score(train1, Y_train))
print(linear.score(test1, Y_test))
print(linear.coef_)
print(len(linear.coef_))
print(linear.intercept_)
比较不同阶多项式拓展的结果,发现二阶能够把模型的准确率提升到64%的水平,之后更多阶并不能显著提升准确率,因此在实际应用中采用二阶多项式拓展即可
来源:CSDN
作者:隐者之王
链接:https://blog.csdn.net/qq_34211618/article/details/103685849