1.导入数据

导入库

# 导入需要的模块
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

import seaborn as sns       

# 离散统计分布以及连续统计分布
from scipy import stats

# 正态分布
from scipy.stats import  norm

# 数据标准化
from sklearn.preprocessing import StandardScaler

# 消除红色警告
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline 

导入数据
https://pan.baidu.com/s/1bugy1D4YKSJjOnns5_YZXA
提取码:x13i

# 导入训练数据
data_train = pd.read_csv("E:/PythonData/machine_learning/train.csv")
# 查看训练数据(前5行数据)
data_train.head()

在这里插入图片描述

2.查看各项主要特征与房屋售价的关系

查看房子售价统计信息

# 查看房子售价的统计信息
data_train['SalePrice'].describe()

在这里插入图片描述
查看缺失值

data_train.isnull().sum()

在这里插入图片描述
查看房价分布

# 绘制密度曲线
sns.distplot(data_train['SalePrice'])
plt.show()

在这里插入图片描述
计算房价的峰度和偏度

# 计算房价的峰度和偏度
SP_skew = data_train['SalePrice'].skew()
SP_kurt = data_train['SalePrice'].kurt()
print('峰度:',SP_skew)
print('偏度:',SP_kurt)

在这里插入图片描述
峰度:

峰度(Kurtosis)是描述某变量所有取值分布形态陡缓程度的统计量。

它是和正态分布相比较的。

Kurtosis=0 与正态分布的陡缓程度相同。

Kurtosis>0 比正态分布的高峰更加陡峭——尖顶峰

Kurtosis<0 比正态分布的高峰来得平台——平顶峰计算公式:β = M_4 /σ^4 偏度:

偏度:

偏度(Skewness)是描述某变量取值分布对称性的统计量。

Skewness=0 分布形态与正态分布偏度相同

Skewness>0 正偏差数值较大,为正偏或右偏。长尾巴拖在右边。

Skewness<0 负偏差数值较大,为负偏或左偏。长尾巴拖在左边。 计算公式: S= (X^ - M_0)/δ Skewness 越大,分布形态偏移程度越大。

分析:
将上面的计算结果、理论和图形相对比可以看到,长尾巴确实拖在右边,而且高峰陡峭。

查看中央空调与售价关系
# CentralAir;是否有中央空调
var = 'CentralAir'
data1 = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)

fig = sns.boxplot(x=var, y="SalePrice", data=data1)
fig.axis(ymin=0, ymax=800000);

在这里插入图片描述

查看装修水平与房价关系

1. 绘制装修水平与房价箱线图

# OverallQual 房子材料与装修水平
var = 'OverallQual'
data2 = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)  
fig = sns.boxplot(x=var, y="SalePrice", data=data2)
fig.axis(ymin=0, ymax=800000);

在这里插入图片描述
2.绘制不同装修水平与对应售价散点图

data2 = data[["SalePrice","OverallQual"]].sort_values(by="OverallQual",ascending=True)
data2.head()

在这里插入图片描述

data2 = data[["SalePrice","OverallQual"]].sort_values(by="OverallQual",ascending=True)
data2.head()

在这里插入图片描述
3.绘制装修水平与房子售价总和柱状图。

O_S = data2[['OverallQual','SalePrice']].groupby(['OverallQual']).sum().sort_values(by='OverallQual',ascending=True)
O_S.plot(kind='bar')
plt.show()

在这里插入图片描述
分析:由上图,房价随着装修水平的提升也逐渐提升。而根据柱状图可知:在装修水平为6-7时房价的销售额最对。即6-7水平的房间卖得最火。

查看建造日期与售价关系
# YearBuilt boxplot 房子建造日期
data3 = pd.concat([data_train['SalePrice'], data_train'YearBuilt']], axis=1)
data3.head()

在这里插入图片描述
绘制不同建造日期与售价散点图

plt.scatter(data3['YearBuilt'],data1['SalePrice'])
plt.show()

在这里插入图片描述
绘制不同建造日期与房价销售额折线图

Y_S = data3[['YearBuilt','SalePrice']].groupby(['YearBuilt']).sum().sort_values(by='YearBuilt',ascending=True)
Y_S.plot()
plt.show()

在这里插入图片描述
总结:房子售价随着年份的推移越来越高。2005年左右房价销售额达到顶峰。

不同地段与房价关系

绘制不同地段与房价箱线图

# Neighborhood   地段与售价关系
var = 'Neighborhood'
data4 = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)
f, ax = plt.subplots(figsize=(26, 12))
fig = sns.boxplot(x=var, y="SalePrice", data=data4)
fig.axis(ymin=0, ymax=800000);

在这里插入图片描述

N_S = data4[['Neighborhood','SalePrice']].groupby(['Neighborhood']).sum().sort_values(by='SalePrice',ascending=True)
N_S.plot(kind='bar',figsize=(20,8))
plt.show()

在这里插入图片描述
分析:由上图,CollgCr地段与NAmes地段房子销售额最高。

查看地皮面积与房价关系
# 地皮面积与售价散点图
# 创建售价与地皮面积表格
data5 = pd.concat([data_train['SalePrice'], data_train['LotArea']], axis=1)
data5.plot.scatter(x='LotArea' , y='SalePrice', ylim=(0, 800000))
plt.show()

在这里插入图片描述
绘制生活面积与房价散点图

# 绘制生活面积与售价散点图
data6 = pd.concat([data_train['SalePrice'], data_train['GrLivArea']], axis=1)    
data6.plot.scatter(x='GrLivArea', y='SalePrice', ylim=(0, 800000))
plt.show()

在这里插入图片描述

查看地下室总面积与房价关系

绘制地下室总面积与房价散点图

# 地下室总面积与售价散点图
data7 = pd.concat([data_train['SalePrice'], data_train['TotalBsmtSF']], axis=1)
data7.plot.scatter(x=var, y='SalePrice', ylim=(0, 800000))
plt.show()

在这里插入图片描述

# 绘制其他资产与售价散点图
data8 = pd.concat([data_train['SalePrice'], data_train['MiscVal']], axis=1)
data8.plot.scatter(x='MiscVal', y='SalePrice', ylim=(0, 800000))
plt.show()

在这里插入图片描述

# 绘制车库与售价散点图
var  = ['GarageArea', 'GarageCars']

data9 = pd.concat([data_train['SalePrice'], data_train[var[0]]], axis=1)
data9.plot.scatter(x=var[0], y='SalePrice', ylim=(0, 800000))
plt.show()

在这里插入图片描述

data10 = pd.concat([data_train['SalePrice'], data_train[var[1]]], axis=1)
GC_S = data10.groupby(data10['GarageCars']).sum().sort_values(by='GarageCars',ascending=True)
GC_S.plot(kind='bar')
plt.xticks(rotation=360)
plt.show()

在这里插入图片描述

查看关联性
# 查看关联性
corrmat = data_train.corr()
f, ax = plt.subplots(figsize=(20, 9))
sns.heatmap(corrmat, vmax=0.8, square=True)

在这里插入图片描述

from sklearn import preprocessing

f_names = ['CentralAir', 'Neighborhood']
for x in f_names:
    label = preprocessing.LabelEncoder()
    data_train[x] = label.fit_transform(data_train[x])
    
corrmat = data_train.corr()
f, ax = plt.subplots(figsize=(20, 9))
sns.heatmap(corrmat, vmax=0.8, square=True)

在这里插入图片描述

# 关系矩阵中将显示10个特征
k  = 10 

cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
cm = np.corrcoef(data_train[cols].values.T)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar=True, annot=True, \
                 square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=cols.values, xticklabels=cols.values)
plt.show()

在这里插入图片描述

3.训练集数据预处理

训练数据预处理
# 数据预处理
from sklearn import preprocessing
# 导入机器学习模型最小二乘法,支持向量机,高斯分布
from sklearn import linear_model, svm, gaussian_process
# 导入机器学习随机森林
from sklearn.ensemble import RandomForestRegressor
# 划分数据
from sklearn.model_selection import train_test_split
import numpy as np

选取特征数据(将数据转换成转换成正态分布)

# 获取数据
# 一共7个特征数据
cols = ['OverallQual','GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']

x = data_train[cols].values
y = data_train['SalePrice'].values

# fit_transform不仅计算训练数据的均值和方差,还会基于计算出来的均值和方差来转换训练数据,从而把数据转换成标准的正太分布
# 将x数据转换成正态分布
x_scaled = preprocessing.StandardScaler().fit_transform(x)
y_scaled = preprocessing.StandardScaler().fit_transform(y.reshape(-1,1))

# 分割数据,测试集展1/3
X_train,X_test, y_train, y_test = train_test_split(x_scaled, y_scaled, test_size=0.33, random_state=42)
创建机器学习模型

创建字典,分别创建三个模型

# 创建字典,分别创建三个模型
clfs = {
        'svm':svm.SVR(), 
        'RandomForestRegressor':RandomForestRegressor(n_estimators=400),
        'BayesianRidge':linear_model.BayesianRidge()
       }

# 分别对3个模型记性训练,并得出预测结果误差
for clf in clfs:
    try:
        clfs[clf].fit(X_train, y_train)
        y_pred = clfs[clf].predict(X_test)
        print(clf + " cost:" + str(np.sum(y_pred-y_test)/len(y_pred)) )
        
    except Exception as e:
        print(clf + " Error:")
        print(str(e))

在这里插入图片描述
分析:随机森林得到的结果误差相对时最小的。
再次创建特征参数

# 创建特征列表
cols = ['OverallQual','GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']

# 将特征值赋值给x
x = data_train[cols].values

# 将房价结果赋值给y
y = data_train['SalePrice'].values

# 将训练数据2/3作为训练集,1/3作为测试集
X_train,X_test, y_train, y_test = train_test_split(x, y, test_size=0.33, random_state=42)

clf = RandomForestRegressor(n_estimators=400)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
得出预测结果
# 显示预测结果
y_pred[::5]

在这里插入图片描述

# 显示测试集结果
y_test[::5]

在这里插入图片描述

4.导入测试集数据

测试集数据预处理
import pandas as pd
from sklearn.ensemble import RandomForestRegressor

# 之前训练的模型
rfr = clf

# 导入测试集数据
data_test = pd.read_csv("E:/PythonData/machine_learning/test.csv")

处理测试集数据缺失值

# 查看缺失值情况
data_test[cols].isnull().sum()

在这里插入图片描述
查看缺失数据的统计情况

# 查看统计情况
data_test['GarageCars'].describe()

在这里插入图片描述

data_test['TotalBsmtSF'].describe()

在这里插入图片描述

创建训练集特征值
# 创建5个特征值
cols2 = ['OverallQual','GrLivArea', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']

# 缺失值处理,利用对应字段的平均值填充缺失值
cars = data_test['GarageCars'].fillna(1.766118)
bsmt = data_test['TotalBsmtSF'].fillna(1046.117970)

# 横向合并
data_test_x = pd.concat( [data_test[cols2], cars, bsmt] ,axis=1) 
data_test_x.isnull().sum()

在这里插入图片描述

x = data_test_x.values
y_te_pred = rfr.predict(x)
print(y_te_pred)

print(y_te_pred.shape)
print(x.shape)

在这里插入图片描述

data_test_x

在这里插入图片描述

得到预测数据
prediction = pd.DataFrame(y_te_pred, columns=['SalePrice'])
result = pd.concat([ data_test['Id'], prediction], axis=1)
# result = result.drop(resultlt.columns[0], 1)
result.head()

在这里插入图片描述

4.保存预测结果

# 保存预测结果
result.to_csv('E:/PythonData/machine_learning/Predictions1.csv', index=False)

注:先将训练集划分成2/3的训练集和测试集。通过不同的训练模型对其进行训练学习,得出每个训练模型的误差。用误差最小的随机森林模型对测试集数据进行训练,得出预测结果。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐