美文网首页
美国King County房价预测训练赛

美国King County房价预测训练赛

作者: 小幸运Q | 来源:发表于2020-02-17 21:29 被阅读0次

数据主要包括2014年5月至2015年5月美国King County的房屋销售价格以及房屋的基本信息。

数据分为训练数据和测试数据,分别保存在kc_train.csv和kc_test.csv两个文件中。

其中训练数据主要包括10000条记录,14个字段,主要字段说明如下:

第一列“销售日期”:2014年5月到2015年5月房屋出售时的日期
第二列“销售价格”:房屋交易价格,单位为美元,是目标预测值
第三列“卧室数”:房屋中的卧室数目
第四列“浴室数”:房屋中的浴室数目
第五列“房屋面积”:房屋里的生活面积
第六列“停车面积”:停车坪的面积
第七列“楼层数”:房屋的楼层数
第八列“房屋评分”:King County房屋评分系统对房屋的总体评分
第九列“建筑面积”:除了地下室之外的房屋建筑面积
第十列“地下室面积”:地下室的面积
第十一列“建筑年份”:房屋建成的年份
第十二列“修复年份”:房屋上次修复的年份
第十三列"纬度":房屋所在纬度
第十四列“经度”:房屋所在经度

销售日期  卧室数   浴室数  房屋面积    停车面积  楼层数  房屋评分  建筑面积  地下室面积  建筑年份  修复年份     纬度      经度
20150302    3     2.25     1670       6240     1.0      8       1240       430      1974       0       47.6413  -122.113

第二列“销售价格”就是目标。

理论上讲,价格应该与卧室数,浴室数,房屋面积,停车面积,楼屋数,房屋评分,建筑面积,地下室面积成正比,跟建筑年份成反比,跟修复年份(不清楚),跟纬度经度有聚类的关系。


<1> 初步分析:

方法1:1v1的看

卧室数-价格.png 浴室数-价格.png 房屋面积-价格.png 评分-价格.png 地下室-价格.png
停车面积-价格.png 楼层数-价格.png
  • 建筑年龄与修复时间与价格的关联性不是特别清楚:
建筑年份-价格.png 修复年份-价格.png (修复年份-建筑年份)-价格.png

1v1的示例代码:

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
data=pd.read_csv("kc_train.csv")

test="停车面积"

temp=data
d=dict(data[test].value_counts())

df = pd.DataFrame({})

for i in d:
    d[i]=0

p1=[]
p2=[]

for i in d:
    p1.append(i)
    d[i]=temp.loc[temp[test]==i]['销售价格'].mean()
    p2.append(d[i])

df[test]=p1
df['销售价格']=p2

sns.set(font='SimHei',font_scale=0.8)  # 解决Seaborn中文显示问题并调整字体大小
sns.barplot(y="销售价格", x=test, data=df)
plt.show()

方法2:当然也可以1v多:

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
data=pd.read_csv("kc_train.csv")

plt.rcParams['font.sans-serif']=['SimHei'] 
plt.rcParams['axes.unicode_minus']=False

corrmat = data.corr()         
plt.subplots(figsize=(12,9))
sns.heatmap(corrmat, vmax=0.9, square=True,center=2.0)
image.png
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['figure.dpi'] = 90 #分辨率

data=pd.read_csv("kc_train.csv")

corrmat = data.corr()   
# 特征相关系数

k = 10 

cols = corrmat.nlargest(k, '销售价格')['销售价格'].index
# 只取关联性前k的特征
# 淘汰了 '销售日期', '停车面积', '建筑年份', '经度' 四个特征

cm = np.corrcoef(data[cols].values.T)
# corrcoef(x,y):计算列向量x、y的相关系数,要求x、y具有相等的元素个数,T是翻转矩阵的意思
# values返回一个array

sns.set(font_scale=0.7)
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=cols.values, xticklabels=cols.values)

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.show()
image.png

<2> 数据清洗

  1. 检查是否存在空值:'True' in data.isnull()发现没有

  2. 去噪

<3> 划分训练集和验证集

训练集,测试集比例为7:3。

def Data(IO):           
    X=IO
    Y = X['销售价格']
    X= X.drop('销售价格'],axis = 1)
    X_train, X_test, y_train, y_test = \
        cross_validation.train_test_split( X, Y, test_size=0.3, random_state=0)
    return (X_train, X_test, y_train, y_test)

<4> 尝试各种算法:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split

data=pd.read_csv("kc_train.csv")

def Data(IO):           
    X=IO
    Y = X['销售价格']
    X= X.drop(['销售价格'],axis = 1)
    X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size=0.3, random_state=0)
    return (X_train, X_test, y_train, y_test)

x_train, x_test, y_train, y_test=Data(data)

def loss(y_test,predicted):
    cost=0
    a=y_test.values
    for i in range(len(predicted)):
        cost+=(predicted[i]-a[i])**2
    return cost/(10000*3000)

def RF(X_train, X_test, y_train, y_test):    #随机森林 
    from  sklearn.ensemble  import  RandomForestClassifier
    model= RandomForestClassifier(n_estimators=10)
    model.fit(X_train, y_train)
    predicted= model.predict(X_test)
    score = loss(y_test, predicted)
    return (score)
# RF: 7752700.0793058
# RF 50 : 5863878.750277567
# RF 100 : 5107723.136976433  /  4840716.8811414
# RF 120 : 4765230.745854666
# RF 150 : 4318322.8558068
rf={"RF:":RF(x_train, x_test, y_train, y_test)}

def LOR(X_train, X_test, y_train, y_test):   #逻辑回归
    from sklearn.linear_model import LogisticRegression
    lor = LogisticRegression(penalty='l1',C=100,multi_class='ovr')
    # C是正则化强度的倒数,越小越强 
    lor.fit(X_train, y_train)
    predicted= lor.predict(X_test)
    score = loss(y_test, predicted)
    return (score)
# LOR: 9709095.706138566
lor={"LOR:":LOR(x_train, x_test, y_train, y_test)}

def Svm(X_train, X_test, y_train, y_test):   #支持向量机
    from sklearn import svm
    model = svm.SVC(kernel='rbf')
    model.fit(X_train, y_train)    
    predicted= model.predict(X_test)
    score = loss(y_test, predicted)
    return (score) 
# Svm: 12909610.382325433
svm={"Svm:":Svm(x_train, x_test, y_train, y_test)}


def LR(X_train, X_test, y_train, y_test):    #线性回归
    from sklearn.linear_model import LinearRegression            
    LR = LinearRegression()
    LR.fit(X_train, y_train)
    predicted = LR.predict(X_test)
    score = loss(y_test, predicted)
    return (score)
# LR: 4597743.434822384
lr={"LR":LR(x_train, x_test, y_train, y_test)}


ans=dict(lr,**lor,**rf,**svm)
ans=sorted(ans.items(),key=lambda ans:ans[1],reverse=True)  
print(ans)

相关文章

网友评论

      本文标题:美国King County房价预测训练赛

      本文链接:https://www.haomeiwen.com/subject/itfmfhtx.html