算法模型构建过程中,需要注意下面两个方面:
1、算法模型的误差不能太大(预测值和真实值之间的误差不能太大)
a. 如果模型的误差比较大
(1) 如果是训练集数据存在该问题:
欠拟合:该模型没有找到特征属性和目标属性之间的关系。
导致的原因:
- 算法的学习能力比较弱、
- 样本少、
- 有用的特征属性数目少
解决方案:
- 换一种学习能力比较强的算法。例如:SVM、集成算法…
- 增加样本数量(基于现有的数据产生模拟的虚假数据、收集更多的数据)
- 增加特征属性的数目(结合业务产生更多的有效特征、将现有的特征属性做一个融合,产生更多的特征属性)
多项式扩展: 属于增维的一种方式,可以将数据映射到高维度空间,变成线性可分的数据。
功能:将低维空间上的数据通过多项式的组合映射到高维空间中。形如:将线性关系通过多项式的组合转换成非线性关系。
方式:
形如:原始二维的特征属性(2,3)
如果做一个最高次项为2的多项式扩展,最终的结果为:(1,2,3,4,6,9) 6个
如果做一个最高次项为3的多项式扩展,最终的结果为:(1,2,3,4,6,9,8,12,18,27)10个
如果做一个最高次项为4的多项式扩展,最终的结果为:(1,2,3,4,6,9,8,12,18,27,16,24,36,54,81) 15个
多项式线性回归 = 多项式扩展 + 线性回归
形如:原特征属性:x1,x2,x3
1、做一个2次的多项式扩展,结果为:1, x1, x2, x3, x1x1, x1x2, x1x3, x2x2, x2x3, x3x3 ,其实是相当于构建一个新的特征属性维度空间:z1, z2, z3, z4, z5, z6, z7, z8, z9, z10 10个
2、基于多项式扩展的结果做一个线性回归:h(z)
PolynomialFeatures(degree = 2,interaction_only=False,include_bias=True)
degree:给定模型做几阶的多项式扩展。
interaction_only:当为True时,形如: x1x2,;当为False,形如:x1x1, x1x2, x2x2。
include_bias:是否添加偏置项 1。
fit_transform():首先使用给定的数据集进行模型训练,找出模型的转换模型函数,然后使用给定的转换函数对X数据做一个转换操作。
代码如下:
#引入所需要的包
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’simHei’]
mpl.rcParams[‘axes.unicode_minus’] = False
#1、加载数据
path = ‘./datas/household_power_consumption_1000.txt’
#path = ‘./datas/household_power_consumption_200.txt’
df = pd.read_csv(path,sep=’;’,low_memory=False)
#日期、时间、有功功率、无功功率、电压、电流、厨房用电功率、洗衣服用电功率、热水器用电功率
names1 = df.columns
print(names1)
names = [“Date”,“Time”,“Global_active_power”,“Global_reactive_power”,“Voltage”,“Global_intensity”,“Sub_metering_1”,“Sub_metering_2”,“Sub_metering_3”]
#数据清洗
df.replace(’?’,np.nan,inplace=True)
datas = df.dropna(axis=0,how=‘any’)
#构建数据
X = datas[names[0:2]]
X = X.apply(lambda x:pd.Series(date_format(x)),axis=1)
Y = datas[names[4]]
X = X.astype(np.float)
Y = Y.astype(np.float)
#将数据划分Wie训练集和测试集
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.2,random_state=0)
#多项式扩展
poly = PolynomialFeatures(degree=3)
X_train = poly.fit_transform(X_train,Y_train)
X_test = poly.transform(X_test)
#做一个线性回归
#lr = LinearRegression(fit_intercept=False)# fir_intercept:是否训练截距项.True是训练,False是不训练。如果不设置偏移量的时候,模型的偏移量会比较大。
lr = LinearRegression(fit_intercept=True)
#模型的训练
lr.fit(X_train,Y_train)
#模型的测试
y_pre = lr.predict(X_test)
#模型效果
print(“R2:”,lr.score(X_test,Y_test))
#画图查看一下效果
t = np.arange(len(X_test))
plt.figure(facecolor=‘w’)
plt.plot(t,y_pre,‘g-’,linewidth = 2, label = u’预测值’)
plt.plot(t,Y_test,‘r-’,linewidth = 2,label = u’真实值’)
plt.legend(loc=‘lower right’)
plt.title(‘线性回归预测时间和功率之间的关系’,fontsize = 20)
plt.grid(b = True)
plt.show()
plt.savefig(‘Poly.png’)
运行的结果: