本博客是线性回归的入门案例,仅用到一阶线性回归
代码中用到的数据集下载地址
[link] https://pan.baidu.com/s/12wSIOVMQ3zS3jK0FcwkTSw[
python3版本代码段
导包
#导包
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import timeimport sklearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error,r2_score
加载数据,过滤残缺数据
# 加载数据
path = '../data_files/household_power_consumption_1000.txt' ## 1000行数据
df = pd.read_csv(path, sep=';', low_memory=False) #当文件中的数据类型为单一类型时,low_memory能提高效率# 异常数据处理(异常数据过滤)
new_df = df.replace('?', np.nan) #用nan替换 有问题的数据,方便进行dropna操作
datas = new_df.dropna(axis=0,how = 'any') # any只要该行有数据为nan,就进行删除操作;all是全为nan时才删除行
从数据中提取特征所需的数据
## 创建一个时间字符串格式化字符串
def date_format(dt):#dt在这里是一行,是Series类型,这一行有两个数据#接下来要把这两个数据拼成字符串,再提取其中的‘年月日时分秒’import timet = time.strptime(' '.join(dt), '%d/%m/%Y %H:%M:%S')return pd.Series([t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec])## 时间和电压之间的关系(Linear)
# 获取x和y变量, 并将时间转换为数值型连续变量
X = datas.iloc[:,0:2]
X = X.apply(date_format, axis=1) #1代表按行,默认的是0代表列
Y = datas['Voltage']
划分数据集,标准化,模型训练,并使用模型预测
# 对数据集进行测试集和训练集划分
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) #用X_test进行的标准化模型训练,用训练好的模型,再对X_test进行转换# 模型训练
lr = LinearRegression()
lr.fit(X_train, Y_train) ## 训练模型# 模型校验
y_pred = lr.predict(X_test) ## 预测结果
打印参数
#打印参数
print(lr.coef_) #打印参数项
print(lr.intercept_) #打印截距项
模型评估
# 模型效果
#第一种方式,用lr.score
print("测试集准确率:",lr.score(X_test, Y_test)) #测试集准确率
#第二种方式,用metrics里的r2_score
print('测试集准确率:',r2_score(Y_test,y_pred))#测试集均方误差
print('测试集均方误差:',mean_absolute_error(Y_test,y_pred))
模型可视化
## 预测值和实际值画图比较
t=np.arange(len(X_test)) #用测试集数据量200作为横轴
plt.figure(facecolor='w')
plt.plot(t, Y_test, 'r-', linewidth=2, label=u'真实值')
plt.plot(t, y_pred, 'b-', linewidth=2, label=u'预测值')
plt.legend(loc = 'lower right')
plt.title(u"线性回归预测时间和功率之间的关系", fontsize=20)
plt.grid(b=True)#网格
plt.show()