本篇笔记是《从自然语言处理到机器学习入门》课程第三次作业的上篇,主要是复现了老大课上讲的利用线性回归对波士顿房价进行预测的实验。在下篇中,将利用该模型对红酒数据集进行线性回归分析。
1 基本要求
利用提供的波士顿房价数据,对其进行分析。数据地址,训练集合测试集已经分好了。
2 完整代码
#-*- coding: UTF-8 -*-
# @Time : 2017/12/21 9:29
# @Author : xiongzongyang
# @Software: PyCharm
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
import matplotlib.pyplot as plt
import sklearn
# from sklean.model_selection import train_test_split
from sklearn.linear_model import LinearRegression #线性回归
from sklearn.linear_model import Ridge #岭回归
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNetCV
from sklearn.metrics import mean_squared_error
import matplotlib as mpl
import matplotlib.pyplot as plt
#读取数据
def read_data(data_path="./data/"):
test_data = pd.read_csv(data_path+"boston_house.test", header=None)
train_data = pd.read_csv(data_path+"boston_house.train", header=None)
#测试数据是否读取成功
# print(train_data)
# print(test_data.head())
# #查看数据的规模
# print(train_data.shape)
# print(test_data.shape)
return train_data,test_data
#数据处理
def deal_data(pd_data):
#获取数据的行数
row_cnt = pd_data.shape[0]
#print(row_cnt)
#计算列数,因为在读入数据时,没有指定分隔符,所以14列数据都是作为一列数据来读入的,因此在计算列数时,将读入的每一行按照空格来分开
column_cnt = len(pd_data.iloc[0, 0].split())
#print(column_cnt)
#empty 会创建一个没有使用特定值来初始化的数组。给这些方法传递一个元组作为形状来创建高维数组:
X = np.empty((row_cnt, column_cnt - 1))
# print(X)
#创建一个高位数组
Y = np.empty((row_cnt, 1))
for i in range(0, row_cnt):
#逐一将每一行进行分割(按空格分割)
row_array = pd_data.iloc[i, 0].split()
#x取前13个数据,X[i]是一个一维数组,则X相当于一个二维数组,Y同理
X[i] = np.array(row_array[0:-1])
#y取最后一个数据
Y[i] = np.array(row_array[-1])
return X, Y
#把特征标准化为均匀分布
def uniform_norm(X):
X_max = X.max(axis=0)
X_min = X.min(axis=0)
return (X - X_min) / (X_max - X_min), X_max, X_min
#实现线性回归
#画图
def draw(pred,test_Y):
t = np.arange(len(pred))
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False
plt.figure(facecolor='w')
plt.plot(t, test_Y, 'r-', lw=2, label=u'true value')
plt.plot(t, pred, 'b-', lw=2, label=u'estimated')
plt.legend(loc='best')
plt.title(u'Boston house price', fontsize=18)
plt.xlabel(u'case id', fontsize=15)
plt.ylabel(u'house price', fontsize=15)
plt.grid()
plt.show()
#模型评估
def evaluate(unif_train_X,train_Y,unif_test_X,test_Y):
print("训练集上效果评估:")
pred_train = model.predict(unif_train_X)
print("R^2系数 ", model.score(unif_train_X, train_Y))
print("均方误差 ", mean_squared_error(train_Y, pred_train))
print("\n测试集上效果评估 :")
r2 = model.score(unif_test_X, test_Y)
print("R^2系数 ", r2)
pred = model.predict(unif_test_X)
print("均方误差 ", mean_squared_error(test_Y, pred))
#主函数
if __name__ == "__main__":
#读取数据
train_data,test_data=read_data()
#数据处理
train_X, train_Y=deal_data(train_data)
# print(train_X.shape)
# print(train_Y.shape)
test_X, test_Y=deal_data(test_data)
# print(test_X.shape)
# print(test_Y.shape)
#把特征标准化为均匀分布
unif_train_X, max_X, min_X = uniform_norm(train_X)
unif_test_X = (test_X - min_X) / (max_X - min_X)
#实现线性回归
model = LinearRegression()
model.fit(unif_train_X, train_Y)
#在训练集上预测
pred_train = model.predict(unif_train_X)
#在测试集上预测
pred = model.predict(unif_test_X)
#画图
draw(pred,test_Y)
#模型评估
evaluate(unif_train_X,train_Y,unif_test_X,test_Y)
3 实验效果
(1)预测的效果图
(2)效果评估
4 相关知识点
本个实验中主要涉及到了以下知识点:
(1)线性回归
(2)pandas,numpy,matplotlib等相关python科学计算库
(3)数据的预处理也非常重要,熟练掌握数据预处理方法对以后的工作中或者是在读别人代码时会轻松很多。
5 相关参考
(1)主要是参考了老大的代码,然后对代码进行了分块处理。
(2)用scikit-learn和pandas学习线性回归