波士顿房价预测(二)
在(一)的基础上进行了数据的异常处理
库:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
读取数据:
train_data=pd.read_csv('train_dataset.csv')
test_data=pd.read_csv('test_dataset.csv')
train_price=train_data['PRICE']
del train_data['PRICE']
col_list=train_data.columns.tolist()
提取测试ID,为提交文件做准备:
test_id=test_data['ID']
del test_data['ID']
L=[]
for x in test_id:
s='id_'+str(x)
L.append(s)
异常值核心代码程序:
通过箱线图进行异常值的判断,同时在下阈值和上阈值的进行分界,把大于或小于该值的数据等于该值
def box_plot_outliers(data_ser, box_scale):
"""
利用箱线图去除异常值
:param data_ser: 接收 pandas.Series 数据格式
:param box_scale: 箱线图尺度,默认用 box_plot(scale=3)进行清洗
:return:
"""
new_up=data_ser.quantile(0.75)
new_low=data_ser.quantile(0.25)
print(new_up,new_low)
iqr = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))
# 下阈值
val_low = data_ser.quantile(0.25) - iqr*1.5
# 上阈值
val_up = data_ser.quantile(0.75) + iqr*1.5
# 异常值
ans=[]
for x in data_ser:
if x>val_up:
x=new_up
if x<val_low:
x=new_low
ans.append(x)
return ans
同时处理训练数据和测试数据的异常值:
all_data=[train_data,test_data]
for x in all_data:
for y in x:
x[y]=box_plot_outliers(x[y],1.5)
导库,建立模型,训练模型,并求出线下mse:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
x_train, x_test, y_train, y_test = train_test_split(train_data, train_price,random_state=1)
linreg = LinearRegression()
model = linreg.fit(x_train, y_train)
y_hat = linreg.predict(np.array(x_test))
mse = np.average((y_hat - np.array(y_test)) ** 2)
print(mse)
预测训练数据,并生成提交文件:
sub=pd.DataFrame()
test_price = linreg.predict(np.array(test_data))
price=[]
for x in test_price:
price.append( round(x,1))
sub['ID']=L
sub['value']=price
sub.to_csv('answer_10.csv',index=False)
线上mse is :13.34479