线性回归中的多项式拓展及pyhton实现

在利用线性回归进行预测时,经常由于数据的线性关系不好,导致模型出现欠拟合,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%的水平,之后更多阶并不能显著提升准确率,因此在实际应用中采用二阶多项式拓展即可
在这里插入图片描述
需要注意的是PolynomialFeatures有两个参数,如下所示
interaction_only: 默认为False;在多项式扩展过程中,是否考虑同一个特征的多次相乘,是否扩展x12或者x12*x2;默认为False,表示扩展;True表示不进行扩展 include_bias:默认为True,是否在多项式扩展的过程中,加入一个常数项,常数项值为1.默认加入

发布了23 篇原创文章 · 获赞 6 · 访问量 4682

猜你喜欢

转载自blog.csdn.net/qq_34211618/article/details/103685849