使用 Python 可视化并构建机器学习模型

发布日期:2026-07-19 09:03:04  来源 : 杭州电子商务研究院    浏览量 :0
杭州电子商务研究院 发布日期:2026-07-19 09:03:04  
0

介绍

本系列关于 Python 数据分析的第 1 部分中,我们讨论了数据准备。在本指南中,我们将重点介绍不同的数据可视化和构建机器学习模型。这两个指南都使用了纽约市 Airbnb 开放数据。如果您没有阅读第 1 部分,请查看它以了解我们如何预处理数据。

在本指南结束时,您将获得以下实践经验:

  • 数据可视化
  • 建立预测模型

让我们开始吧!

可视化

据说,当我们将数据可视化时,我们可以更快地理解。在下面的代码中,我们将处理六种类型的图。

      fig = plt.figure(figsize = (15,10))
ax = fig.gca()
data.hist(ax=ax)
plt.show()
    
      labels = data.neighbourhood_group.value_counts().index
colors = ['lightblue','beige','lightgreen','orange','cyan']
explode = [0,0,0,0,0]
sizes = data.neighbourhood_group.value_counts().values

plt.figure(0,figsize = (7,7))
plt.pie(sizes, explode=[0.1,0.0,0.3,0.5,0.0], labels=labels, colors=colors, autopct='%1.1f%%',shadow=True)
plt.title('Neighbourhood Group',color = 'black',fontsize = 15)
plt.show()
    
      #neighbourhood_group-price
result = data.groupby(["neighbourhood_group"])['price'].aggregate(np.median).reset_index().sort_values('price')
sns.barplot(x='neighbourhood_group', y="price", data=data,palette=colors, order=result['neighbourhood_group']) 
plt.xticks(rotation=45)
plt.show()
    
      #neighbourhood_group-availability_365
result = data.groupby(["neighbourhood_group"])['availability_365'].aggregate(np.median).reset_index().sort_values('availability_365')
sns.boxplot(x='neighbourhood_group', y="availability_365", data=data) 
plt.show()
    
      labels = data.room_type.value_counts().index
colors = ['lightblue','pink','beige']
explode = [0,0,0]
sizes = data.room_type.value_counts().values


plt.figure(0,figsize = (7,7))
plt.pie(sizes, explode=[0,0.05,0.5], labels=labels, colors=colors, autopct='%1.1f%%', shadow=True)
# plot.pie(explode=,autopct='%1.1f%%',ax=ax[0],)
plt.title('Room-Type',color = 'Brown',fontsize = 15)
plt.show()
    
      #room_type-price
result = data.groupby(["room_type"])['price'].aggregate(np.median).reset_index().sort_values('price')
sns.barplot(x='room_type', y="price", data=data, order=result['room_type']) 
plt.show()
    
      #room_type-availability_365
result = data.groupby(["room_type"])['availability_365'].aggregate(np.median).reset_index().sort_values('availability_365')
sns.boxplot(x='room_type', y="availability_365", data=data, order=result['room_type']) 
plt.show()
    
      sns.lineplot(x='availability_365',y='price',data=data)
plt.show()
    
      plt.figure(figsize=(10,6))
sns.scatterplot(data.longitude,data.latitude,hue=data.neighbourhood_group)
plt.ioff()
    
      plt.figure(figsize=(10,6))
sns.scatterplot(data.longitude,data.latitude,hue=data.availability_365)
plt.ioff()
    

预测模型

线性回归主要用于预测。线性回归 (LR) 和随机森林回归 (RFR) 模型均基于监督学习,可用于分类回归。与 RFR 相比,LR 简单且易于实现。但简单性总是以过度拟合模型为代价。它需要正则化来避免这种情况。RFR 包含内置正则化,我们可以更多地关注模型。在此处了解有关 LR 及其语法的更多信息

数学上单个LR的写法为:

随机森林是一种高级回归器。它使用集成技术进行预测。由许多模型组成的模型称为集成模型。有两种类型:装袋提升。RFR是一种装袋技术。随机森林中的树是并行运行的。在构建树时,它们不会相互影响。一旦所有树都构建完毕,就会对它们进行投票或平均。

RFR 树如下所示:

为了避免任何浮点型错误,我们将准备用于预测的数据集。

      data_pred = pd.read_csv(r'nyc_airbnb\AB_NYC_2019.csv')
    
      #prepare-data
data_pred.drop(['name', 'host_name', 'last_review'], inplace=True, axis=1)
data_pred['reviews_per_month'] = data_pred['reviews_per_month'].fillna(value=0, inplace=False)
    

正如我们之前看到的,neighborhood_groupneighborhoodroom type都是文本形式。我们的模型不会使用文本数据进行预测,以使数据模型易于理解。我们使用sklearn 中的LableEncoder类。

      le = preprocessing.LabelEncoder()

le.fit(data_pred['neighbourhood_group'])
data_pred['neighbourhood_group']=le.transform(data_pred['neighbourhood_group'])

le.fit(data_pred['neighbourhood'])
data_pred['neighbourhood']=le.transform(data_pred['neighbourhood'])

le.fit(data_pred['room_type'])
data_pred['room_type']=le.transform(data_pred['room_type'])
    
      predi= random_forest.predict(X_test)
    

坚持

该模型在训练数据集上进行学习。它包含一个已知输出。我们的模型的预测是在测试数据集上完成的。数据要么按 70:30 的比例分割,要么按 80:20 的比例分割。我们已将此模型的大小设置为 80:20。

我们将使用 R2 分数测试其可靠性

      lm = LinearRegression()

X = data_pred.drop(['price', 'longitude'], inplace=False, axis=1)
y = data_pred['price']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)

lm.fit(X_train, y_train)
    
      predictions = lm.predict(X_test)
    
      # Evaluated-metrics

mae = metrics.mean_absolute_error(y_test, predictions)
mse = metrics.mean_squared_error(y_test, predictions)
rmse = np.sqrt(metrics.mean_squared_error(y_test, predictions))
r2 = metrics.r2_score(y_test, predictions)


print('MAE (Mean-Absolute-Error): %s' %mae)
print('MSE (Mean-Squared-Error): %s' %mse)
print('RMSE (Root-MSE): %s' %rmse)
print('R2 score: %s' %r2)
    

对于此数据集,保留方法的 R2 分数表现不佳。0.09 不稳定,可能导致数据过度拟合欠拟合。我们将检查交叉验证方法。但这个问题不是永久性的。我们可以通过在数据子集上多次重复计算来提高分数。

交叉验证(k 倍)

这是一个评估机器学习模型技能的过程。交叉验证 (CV) 有一个参数 K,表示部分/折叠的数量。每个折叠在某个时候用作测试集。一旦过程完成,我们就可以总结和评估矩阵。

      from sklearn.model_selection import KFold, GridSearchCV,  cross_val_score
from sklearn.ensemble import RandomForestRegressor
    

我们将使用random_forest()<font sty

以上内容来自杭州电子商务研究院推送
分享到:

长按或扫码识别 分享给好友

长按或扫码识别 分享给好友
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据