利用线性回归熟悉机器学习基本流程

文章目录

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
from pandas import DataFrame
import time

from sklearn.model_selection import train_test_split#划分训练集和测试集用的
from sklearn.linear_model import LinearRegression #线性回归学习器,用线性拟合用的
from sklearn.preprocessing import StandardScaler#标准化,why要标准化呢?使得不同的量纲具有可比性
# 划分训练集和测试集的目的:我用一套卷子训练你能力,不能再用这套卷子考你
#why要标准化呢?使得不同的量纲具有可比性
#一般我们如何衡量区别呢,量化出一个长度来,比如说实例和实例的区别,我们要计算出
#他们的距离,比如我要比较两个人区别,比如说身高(140cm;180cm),体重,眼睛大小(1.5cm,1cm);
#眼睛并不能决定距离大小,因为身高权重值太大了;除非这两者之间单位为1,才具有可比性;

#防止中文乱码
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False

path1 = './datas/household_power_consumption_1000.txt'
df = pd.read_csv(path1, sep=';', low_memory = False)
df.head()

在这里插入图片描述

何时将数据可以扔掉?
如果有一列的特征的数据是一模一样的,即可剔除;若有一两个不一样那就要分情况了;

# new_df = df.replace('?',np.nan) #处理异常数据
# datas = new_df.dropna(axis=0,how ='any') #按行,只要有任何特征即可干掉
new_df = df.replace('?',np.nan)
datas = new_df.dropna(axis=0,how='any')
datas.describe()#查看统计样

datas.describe().T

在这里插入图片描述

在这里插入图片描述

# def data_format(dt):
# t = time..strptime(''.join(dt),'%d/%m/%Y %H:%M:%S')
# return (t.tm_year,t.tm_mon,)
def date_format(dt):
    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)

# X = datas.iloc[:,0:2]#选取所有行,0-2列
# X = X.apply(lambda x: pd.Series(data_format(x)),axis = 1)#针对行进行操作,转换成年月日的形式
X = datas.iloc[:,0:2]
X = X.apply(lambda x: pd.Series(date_format(x)), axis = 1)

Y = datas['Global_active_power']#指定Y是功率

X.head()

在这里插入图片描述

#划分训练集和测试集
# X_train,X_test,Y_train,Y_test= train_test_split(x,y,test_size=0.2,random_state = 10)
# X_train.shape
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state = 10)
X_train.describe()#查看统计样本

在这里插入图片描述

#上图发现年和月都一样(对应0和1列),还有第5列
#分割好了训练集和测试集之后进行数据标准化处理

# ss = StandardScaler()
ss = StandardScaler()#这个学习器就是为了方便转化
X_train =ss.fit_transform(X_train)#训练集和测试集按照同一种变化,都是按照训练集的期望和方差来的,保证训练集和测试集是同一个分布,故下面的测试集
                                  #直接用学习器
X_test = ss.transform(X_test) #这里直接用学习器进行转换即可





# ss = StandardScaler()
ss = StandardScaler()#这个学习器就是为了方便转化
X_train =ss.fit_transform(X_train)#训练集和测试集按照同一种变化,都是按照训练集的期望和方差来的,保证训练集和测试集是同一个分布,故下面的测试集
                                  #直接用学习器
X_test = ss.transform(X_test) #这里直接用学习器进行转换即可

pd.DataFrame(X_train).describe()
# pd.DataFrame(X_train).describe()


#怎么拟合,先生成一个线性回归的学习器,这里要截距
lr = LinearRegression(fit_intercept = True)#声明学习器

lr.fit(X_train,Y_train) #这里用学习器进行拟合

y_predict = lr.predict(X_test)#用学习器去预测测试集上面的数据
#拟合线性强不强,这就要看其相关性了,看协方差,这里看R^2,
#注意,这里只是衡量线性相关性的,不代表相关性!
#线性相关性不好,可以改变曲线的形状,使得其变好


lr.score(X_train,Y_train)#如果这里的训练集与下面的测试集相差不大,说明拟合的还行

lr.score(X_test,Y_test)#这里拟合并不好!不用管,这里只是串一下线性回归的思路

mse = np.average((y_predict - Y_test)**2)#预测值减去实际值的平方和再取均值
rmse = np.sqrt(mse)
rmse


#上面看到了拟合的效果,如果理想,下面就要用这个模型了
#下面就要看看模型的系数了;
lr.coef_ #系数为0说明特征被干掉了,这里为年月日时分秒,没有截距


lr.intercept_ #查看截距,到这里就知道方程了


#保存模型,可以把模型保存至数据库,也可以固化(保存至本地)
#固化模型(dump),主要固化回归器,标准化学习器
from sklearn.externals import joblib
joblib.dump(ss,"result/data_ss.model")#这里需要先将result这个文件夹创建起来
joblib.dump(lr,"result/data_lr.model")


#固化下来之后可以直接加载,不用再训练了
ss3 = joblib.load("result/data_ss.model")
lr3 = joblib.load("result/data_lr.model")


#查看效果
data1 = [[2006,12,17,12,25,0]]
data1 = ss3.transform(data1)
data1

#查看预测结果
lr3.predict(data1)
t = np.arange(len(X_test)) #把测试集数据打平,打平成x轴

plt.figure(facecolor = 'w') #画布,背景色
plt.plot(t, Y_test, 'r-', linewidth = 2, label = '真实值')
plt.plot(t, y_predict, 'g-', linewidth = 2, label = '预测值')
plt.legend(loc = 'upper left') #图例
plt.title('线性回归时间和功率关系',fontsize=20)
plt.grid(b=True) #网格
plt.show()


总结

这里的一般流程为:
获取数据------>加载数据----->数据处理(剔除掉无效数据,有关数据处理的方法可能还有很多)----->划分训练集和测试集----->数据标准化处理(这里需要利用相关的学习器)----->数据拟合(利用相关学习器进行拟合)----->测试模型效果(如果效果不行还需修正模型,本篇这里本没有写)----->使用模型(可以查看其系数和截距)----->保存模型(固化模型)----->预测结果----->画图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值