当前位置:   article > 正文

实现房价预测及计算过程中相关实验数据可视化_真实数据和预测数据对比图

真实数据和预测数据对比图

实现房价预测及计算过程中相关实验数据可视化

实验所有数据都可关注公众号:Time木 回复关键字:房价预测可视化

1.数据读取

根据数据文件类型以及数据探索、数据处理和数据预测实验的要求,读取数据并处理为符合要求的格式。除读取数据外,需展示数据前10行和后10行。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

data_train = pd.read_csv('train.csv')
data_test = pd.read_csv('test.csv')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

可能需要安装seaborn库:cmd下输入命令:conda install seaborn
(1)读取数据以及显示前10行数据:
在这里插入图片描述
显示后10行代码及结果截图:
在这里插入图片描述

2. 数据探索与数据处理

2.1 查看数据的基本统计特征情况和拓展统计特征情况(最大值、最小值、均值等,可分别使用命令,也可使用综合命令describe);
2.1.1查看数据基本统计特征:
在这里插入图片描述
2.2 ,从数据中选择三个以上的使用数字表示的属性,使用相应命令查看该属性数据是否存在缺失值、异常值。记录相应属性数据缺失值和非缺失值的数量,使用饼图展示缺失值和非缺失值的比例,异常值和非异常值的比例。使用柱状图展示所选择的三个以上属性的缺失值和异常值的数量对比情况;
2.2.1保留使用数字表示的属性

numeric_features = train.dtypes[train.dtypes != 'object'].index  # 排除object类型的特征
  • 1

2.2.2使用相应命令查看该属性数据是否存在缺失值、异常值
在这里插入图片描述
2.2.3选取5个属性
在这里插入图片描述
2.2.4记录缺失值与非缺失值的数量
在这里插入图片描述
2.2.5使用饼图展示缺失值和非缺失值的比例,异常值和非异常值的比例

a展示LotFrontage缺失值与非缺失值比例
 # 数据
labels = ['缺失值', '非缺失值']
a = list1[0]/(list1[0]+list2[0])
b = list2[1]/(list1[0]+list2[0])
share = [a,b]
#分裂饼图
plt.pie(share,labels=labels, autopct='%3.1f%%', colors=['c', 'r'])
#标题
plt.title('LotFrontage缺失值与非缺失值比例')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
b展示LotFrontage异常值和非异常值的比例

 q25 = data_x['LotFrontage'].quantile(0.25)
q75 = data_x['LotFrontage'].quantile(0.75)
max_qz = q75 + 1.5 * (q75 - q25)
a = sum(data_x['LotFrontage'] > max_qz) #采用盖帽操作,控制变量的数值范围,一般情况采用分位数来限定
b = data_x5.shape[0] - a
  • 1
  • 2
  • 3
  • 4
  • 5
 #数据
labels = ['异常值', '非异常值']
share = [a,b]
 #分裂饼图
plt.pie(share,labels=labels, autopct='%3.1f%%', colors=['c', 'r'])
#标题
plt.title('LotFrontage异常值与非异常值比例')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

2.2.6使用柱状图展示所选择的三个以上属性的缺失值和异常值的数量对比情况;

(1)统计’LotFrontage’,‘MasVnrArea’,‘MoSold’,‘GarageYrBlt’,'3SsnPorch’异常值

 data_x5 = ['LotFrontage','MasVnrArea','MoSold','GarageYrBlt','3SsnPorch']
strange = []
for a in data_x5:
    #采用盖帽操作,控制变量的数值范围,一般情况采用分位数来限
    q25 = train[a].quantile(0.25)
    q75 = train[a].quantile(0.75)
    max_qz = q75 + 1.5 * (q75 - q25)
    strange.append(sum(train[a] > max_qz))
print(strange)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(2)柱状图展示

# 设置中文显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#设置标题
plt.title('缺失值和异常值的数量')
#数据准备
x = ['LotFrontage','MasVnrArea','MoSold','GarageYrBlt','3SsnPorch']
#设置图形宽度
bar_width = 0.3
X_A = np.arange(len(x))  # 缺失值条形图的横坐标
X_B = X_A + bar_width  #异常值条形图的横坐标
#绘制图形
plt.bar(X_A,list1,bar_width,align='center',color='r')
#并列柱状图:x轴加上宽度
plt.bar(X_B,list_strange,width=bar_width,color='y')
plt.xticks(X_A + bar_width/2, x)# 让横坐标显示运动
#加图例 
plt.legend(['缺失值','异常值'])
fig=plt.gcf()
#显示
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述

2.3使用箱线图查看所选择三个以上属性的数据的分布情况,根据结果图片判断当前属性数据是否存在异常值。
a查看LotFrontage、MasVnrArea 、MoSold 、3SsnPorch的箱线图(举一个例子)
在这里插入图片描述
2.4如果存在缺失值和异常值,进行相应处理。
a对以上四个属性进行处理:

 x_var_list=train[numeric_features] .columns.values #取出列名
 data_x=train[numeric_features] .loc[:,x_var_list]
 data_x4 = ['LotFrontage','MasVnrArea','MoSold','3SsnPorch']
for a in data_x4:
#得到中位数以后进行缺失值填充
    data_x[a]=data_x[a].fillna(data_x[a].median())
#异常值处理
    temp_series=data_x[a] > max_qz #确定那些行大于盖帽最大值
    data_x.loc[temp_series,a] = max_qz #覆盖原来最大值
    data_x[a].describe()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.5处理完成后重复上述过程1、2、3,使用命令查看是否存在缺失值,异常值,使用箱线图查看数据是否存在异常值。并与之前的结果进行对比。
a查看是否存在缺失值和异常值:
在这里插入图片描述

b使用箱线图查看数据是否存在异常值
再次查看LotFrontage、MasVnrArea 、MoSold 、3SsnPorch的箱线图
方法同2.3

3. 完成房价预测任务

在完成数据探索和数据处理任务后,进行数据预测。分别使用决策树回归、线性回归、SVM回归、Adaboost回归、GBRT回归这几种方法完成房价预测任务,记录各个模型的预测结果,在同一张折线图中展示上述模型预测结果与真实数据存在的差异(y轴代表预测数值,X轴代表元素个数),使用不同颜色线和点表示某一个模型的预测结果,使用图例legend展示。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

data_train = pd.read_csv('train.csv')
data_test = pd.read_csv('test.csv')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
def drop_low_colums(df):
    data_corr=df.corr()
    d_list=data_corr[data_corr.SalePrice<0.5].index.tolist()
    return d_list

data_train=data_train.drop(['YearBuilt','1stFlrSF'], axis=1)
data_test=data_test.drop(['YearBuilt','1stFlrSF'], axis=1)
data_drop_train=data_train.drop(['Alley','PoolQC','Fence','MiscFeature'], axis=1)
data_drop_test=data_test.drop(['Alley','PoolQC','Fence','MiscFeature'], axis=1)
drop_list=drop_low_colums(data_drop_train)
data_drop_train1=data_drop_train.drop(drop_list, axis=1)
data_drop_test1=data_drop_test.drop(drop_list, axis=1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
data_drop_train1=data_drop_train1.fillna('0')
data_drop_test1=data_drop_test1.fillna('0')
  • 1
  • 2
from sklearn import preprocessing
def encode_features(df_train, df_test):
    features = data_drop_train1.select_dtypes(include=object).columns
   
    
    for feature in features:
        le = preprocessing.LabelEncoder()
        df_train[feature] = le.fit_transform(df_train[feature])
        df_test[feature] = le.fit_transform(df_test[feature])
    return df_train, df_test
    
data_train, data_test = encode_features(data_drop_train1, data_drop_test1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
data_drop_train2=data_train.corr()
drop_list2=list(data_drop_train2.query('SalePrice<0.5').index)
data_drop_train2=data_train.drop(drop_list2, axis=1)
data_drop_test2=data_test.drop(drop_list2, axis=1)
  • 1
  • 2
  • 3
  • 4
def change_colums(colums):
    fz=np.ceil(np.log2(colums.max()))
    return fz

fz=change_colums(data_drop_train2.GarageArea)
data_drop_train2['GarageArea'] = pd.cut(data_drop_train2.GarageArea, fz)
fz=change_colums(data_drop_train2.GrLivArea)
data_drop_train2['GrLivArea'] = pd.cut(data_drop_train2.GrLivArea, fz)
fz=change_colums(data_drop_train2.TotalBsmtSF)
data_drop_train2['TotalBsmtSF'] = pd.cut(data_drop_train2.TotalBsmtSF, fz)
fz=change_colums(data_drop_train2.YearRemodAdd)
data_drop_train2['YearRemodAdd'] = pd.cut(data_drop_train2.YearRemodAdd, fz)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
data_drop_test2["TotalBsmtSF"] = data_drop_test2["TotalBsmtSF"].astype("int64")
data_drop_test2["GarageArea"] = data_drop_test2["GarageArea"].astype("int64")
data_drop_test2["GrLivArea"] = data_drop_test2["GrLivArea"].astype("int64")
data_drop_test2["GarageCars"] = data_drop_test2["GarageCars"].astype("int64")
data_drop_test2.loc[data_drop_test2['YearRemodAdd'] == 0] = int(data_drop_test2["YearRemodAdd"].mean())
  • 1
  • 2
  • 3
  • 4
  • 5
fz=change_colums(data_drop_test2.YearRemodAdd)
data_drop_test2['YearRemodAdd'] = pd.cut(data_drop_test2.YearRemodAdd, fz)
fz=change_colums(data_drop_test2.TotalBsmtSF)
data_drop_test2['TotalBsmtSF'] = pd.cut(data_drop_test2.TotalBsmtSF,fz)
fz=change_colums(data_drop_test2.GarageArea)
data_drop_test2['GarageArea'] = pd.cut(data_drop_test2.GarageArea,fz)
fz=change_colums(data_drop_test2.GrLivArea)
data_drop_test2['GrLivArea'] = pd.cut(data_drop_test2.GrLivArea, fz)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
def encode_features1(df_train, df_test):
    features = ['YearRemodAdd', 'TotalBsmtSF', 'GrLivArea', 'GarageArea']
    df_combined = pd.concat([df_train[features], df_test[features]])
    
    for feature in features:
        le = preprocessing.LabelEncoder()
        le = le.fit(df_combined[feature])
        df_train[feature] = le.transform(df_train[feature])
        df_test[feature] = le.transform(df_test[feature])
    return df_train, df_test

data_train1, data_test1 = encode_features1(data_drop_train2, data_drop_test2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
from sklearn.model_selection import train_test_split
X=data_train1[['OverallQual', 'YearRemodAdd', 'TotalBsmtSF', 'GrLivArea', 'FullBath', 'TotRmsAbvGrd', 'GarageCars', 'GarageArea']]
y=data_train1['SalePrice']
#随机划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
  • 1
  • 2
  • 3
  • 4
  • 5
from numpy.core.umath_tests import inner1d
# 1.决策树回归
from sklearn import tree
model_decision_tree_regression = tree.DecisionTreeRegressor()
# 2.线性回归
from sklearn.linear_model import LinearRegression
model_linear_regression = LinearRegression()
# 3.SVM回归
from sklearn import svm
model_svm = svm.SVR()
# 6.Adaboost回归
from sklearn import ensemble
model_adaboost_regressor = ensemble.AdaBoostRegressor(n_estimators=50)  # 这里使用50个决策树
# 7.GBRT回归
from sklearn import ensemble
model_gradient_boosting_regressor = ensemble.GradientBoostingRegressor(n_estimators=100)  # 这里使用100个决策树
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
def try_different_method(model, method):
    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)
    result = model.predict(X_test)
    plt.figure()
    plt.plot(np.arange(len(result)), y_test, "go-", label="True value")
    plt.plot(np.arange(len(result)), result, "ro-", label="Predict value")
    plt.title(f"method:{method}---score:{score}")
    plt.legend(loc="best")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
try_different_method(model_decision_tree_regression,"model_decision_tree_regression")
try_different_method(model_linear_regression,"model_linear_regression")
try_different_method(model_svm,"model_svm")
try_different_method(model_adaboost_regressor,"model_adaboost_regressor")
try_different_method(model_gradient_boosting_regressor,"model_gradient_boosting_regressor")
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

实验所有数据都可关注公众号:Time木 回复关键字:房价预测可视化

潦草制作,仅供参考,或有错误,感谢提醒。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/760924
推荐阅读
相关标签
  

闽ICP备14008679号