Python数据分析之房价预测
学习数据分析的第⼀次练⼿项⽬。从⽹上爬取关于房价的相关数据属性来分析房价,并且基于⼀些属性来预测房价,使⽤的是⽹格搜索算法。相关的数据⽂件和完整代码可以从⽂末获取。
GridSearchCV介绍:
能够系统地遍历多种参数组合,通过交叉验证确定最佳效果参数;他能够⾃动调参,只要把参数输进去,就能给出最优化的结果和参数,适合于⼩数据集。
⼀、需要的相关库:
(1)numpy (2)pandas (3)matplotlib (4)seaborn (5)scikit-learn
以上所有库都能通过 pip下载,在⽤之前要先去看看官⽅API,英⽂看不懂可以去菜鸟教程看看。
⼆、代码部分:
(⼀)提取所需属性保存到CSV中
将房价数据⽂件中的price、bedrooms、sqft_living、grade这⼏列提取到另⼀个新的CSV中保存,⽅便
后续的进⾏:
plt.style.use("fivethirtyeight")
sns.set_style({'font.sans_serif':['simhei','Arial']}) #转换字体
#提取所需数据保存到CSV中
def get_data():
with open('house_price_data.csv','rt') as f1:
f = open('./house_price.csv', 'wt', encoding='utf-8',newline='')
df = pd.read_csv('./house_price_data.csv', usecols=['price', 'bedrooms', 'sqft_living', 'grade'])
<_csv('./house_price.csv')
f.close()
f1.close()
(⼆)数据分析并实现可视化
绘制属性之间的可视化图表,通过图表直观展⽰属性值对于房价的影响程度。在绘制之前先看数据完整程度,是否需要进⾏特征⼯程将缺失值、异常值数据处理好。(tip:这⾥没有进⾏特征⼯程,会影响后⾯的建模预测)
def data_analyse():
ad_csv('./house_price.csv')
#df.info() #检查数据缺失值情况
#房价与室内⾯积关系的可视化
f,[ax1,ax2]=plt.subplots(1,2,figsize=(20,5))
sns.distplot(df['sqft_living'],bins=20,ax=ax1,color='r')
sns.kdeplot(df['sqft_living'],shade=True,ax=ax1)
plt.show()
#房价与卧室个数关系的可视化
f,[ax1,ax2]=plt.subplots(1,2,figsize=(20,8))
sns.barplot(x='bedrooms',y='price',data=df,ax=ax1)
#房价与grade关系的可视化图
sns.barplot(x='grade',y='price',data=df,ax=ax1)
plt.show()
#绘制多变量之间的对⽐关系图
sns.pairplot(df,vars=('price','sqft_living','grade','bedrooms'))
plt.show()
绘制出来的图表:
菜鸟教程python下载图1 居室⾯积与房价的关系图
图2 卧室个数、等级与房价的关系图
图3 各属性关系散点图
三、数据划分
划分数据为两部分,分别为训练数据和测试数据,可以⾃⼰控制训练数据多少,这⾥训练数据为70%,剩余30%⽤于测试。
ad_csv('./house_price.csv')
columns=['bedrooms','sqft_living','grade','price']
data=pd.DataFrame(data,columns=columns) #重新摆放位置
prices=data['price']
features=data.drop('price',axis=1)
features=np.array(features)
prices=np.array(prices)
features_train,features_test,prices_train,prices_test=train_test_split(features,prices,test_size=0.3,random_state=0)
四、建⽴模型计算R2分数
⽤⽹格搜索算法建⽴模型,通过交叉验证对参数空间进⾏求解,寻最佳的参数。
#建⽴模型
def fit_model(X,y):
cross_validator=KFold(n_splits=10,shuffle=True)
regressor=DecisionTreeRegressor()
params={'max_depth':range(1,11)}
scoring_fnc=make_scorer(performance_metric)
grid=GridSearchCV(estimator=regressor,param_grid=params,scoring=scoring_fnc,cv=cross_validator)
grid=grid.fit(X,y)
return grid.best_estimator_
#计算R2分数
def performance_metric(y_true,y_predict):
score=r2_score(y_true,y_predict)
return score
五、获取最优模型并预测房价
获取到的score仅为0.61,准确度不是很⾼,可能原因是没有对缺失异常值进⾏处理,没有进⾏调参。
#获得最优模型
optimal_reg=fit_model(features_train,prices_train)
print("最理想模型的参数‘max_depth’是{}".format(_params()['max_depth']))
predicted_value=optimal_reg.predict(features_test)
r2=performance_metric(prices_test,predicted_value)
print("最优模型在测试数据上R^2分数{:,.2f}".format(r2))
#房价预测
client_data=[[3,1200,8],[4,720,8],[5,2310,7]]
predicted_price=optimal_reg.predict(client_data)
for i,price in enumerate(predicted_price):
print("第{}位客户,根据您输⼊的信息预测到的房价为:¥{:,.2f}".format(i+1,price))
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论