天天看点

波士顿房价预测(二)波士顿房价预测(二)

波士顿房价预测(二)

在(一)的基础上进行了数据的异常处理

库:

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