🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章

大数据分析案例合集
大数据分析案例-基于随机森林算法预测人类预期寿命
大数据分析案例-基于随机森林算法的商品评价情感分析
大数据分析案例-用RFM模型对客户价值分析(聚类)
大数据分析案例-对电信客户流失分析预警预测
大数据分析案例-基于随机森林模型对北京房价进行预测
大数据分析案例-基于RFM模型对电商客户价值分析
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型
大数据分析案例-基于决策树算法构建员工离职预测模型

大数据分析案例-基于KNN算法对茅台股票进行预测

大数据分析案例-基于多元线性回归算法构建广告投放收益模型
大数据分析案例-基于随机森林算法构建返乡人群预测模型
大数据分析案例-基于决策树算法构建金融反欺诈分类模型

目录

1.项目背景

2.项目简介

2.1项目说明

2.2数据说明

2.3技术工具

3.算法原理

4.项目实施步骤

4.1理解数据

4.2探索性数据分析

4.3特征工程

4.4模型构建

4.5模型评估

4.6模型预测

5.实验总结

源代码


1.项目背景

        随着智能手机市场的迅速发展和产品种类的不断增多,消费者面临着越来越多的选择。智能手机的价格受到多种因素的影响,如品牌、型号、配置、性能、外观等,这些因素之间可能存在复杂的非线性关系。因此,准确地预测智能手机的价格对于消费者、企业乃至整个市场都具有重要意义。

        随机森林算法作为一种集成学习方法,通过构建多个决策树并将它们的预测结果进行集成,能够处理大量的数据并有效地处理特征之间的非线性关系。这种算法在处理复杂的数据集和预测任务时表现出色,因此被广泛应用于各种领域,包括价格预测。

        在智能手机价格预测领域,随机森林算法可以综合考虑多个因素,如品牌、型号、配置、性能等,对智能手机的价格进行准确预测。通过训练一个基于随机森林算法的模型,我们可以利用历史数据学习不同因素对价格的影响程度,并预测新手机的价格。这种预测模型不仅可以帮助消费者做出更明智的购买决策,还可以为企业制定市场策略提供参考。

        此外,智能手机价格预测模型还可以应用于市场分析、产品定价、库存管理等领域。例如,企业可以利用预测模型分析市场趋势,预测未来一段时间内的需求变化,并据此制定生产计划、调整库存水平。同时,预测模型还可以帮助企业了解消费者对不同价格区间的偏好,从而制定更合理的定价策略。

2.项目简介

2.1项目说明

        本实验旨在构建一个基于随机森林算法的智能手机价格预测模型,通过分析智能手机的多项特征,如品牌、型号、配置等,来准确预测其市场价格,从而为消费者和企业提供有价值的参考信息。

2.2数据说明

该数据集提供了各种智能手机的全面信息集合,可以对其规格和定价进行详细分析。它涵盖了广泛的智能手机,涵盖不同的品牌、型号和配置,使其成为对智能手机行业感兴趣的研究人员、数据分析师和机器学习爱好者的宝贵资源。

数据来自西班牙网站PC Components。数据是使用 Power Automate 收集的。

包括的字段:

Smartphone:智能手机的唯一标识符或型号名称。

Brand:智能手机品牌。

Model:智能手机品牌型号。

RAM:可用于多任务处理的内存量,也叫运行内存。

Storage:智能手机的容量,即固态内存。

Color:智能手机的颜色。

Free:如果智能手机附有移动公司合同,则为/否。

Final Price:以相应货币表示的智能手机成本。

通过利用该数据集,研究人员和分析师可以探索智能手机规格与其定价之间的模式、趋势以及关系。它是执行价格预测、市场分析和不同智能手机配置比较等任务的绝佳资源。无论您是有兴趣确定最具成本效益的选项,还是了解特定硬件组件对智能手机价格的影响,该数据集都为深入探索提供了丰富的可能性。

2.3技术工具

Python版本:3.9

代码编辑器:jupyter notebook

3.算法原理

        随机森林是一种有监督学习算法。就像它的名字一样,它创建了一个森林,并使它拥有某种方式随机性。所构建的“森林”是决策树的集成,大部分时候都是用“bagging”方法训练的。bagging 方法,即 bootstrapaggregating,采用的是随机有放回的选择训练数据然后构造分类器,最后组合学习到的模型来增加整体的效果。简而言之,随机森林建立了多个决策树,并将它们合并在一起以获得更准确和稳定的预测。其一大优势在于它既可用于分类,也可用于回归问题,这两类问题恰好构成了当前的大多数机器学习系统所需要面对的。

        随机森林分类器使用所有的决策树分类器以及 bagging 分类器的超参数来控制整体结构。与其先构建 bagging分类器,并将其传递给决策树分类器,我们可以直接使用随机森林分类器类,这样对于决策树而言,更加方便和优化。要注意的是,回归问题同样有一个随机森林回归器与之相对应。

        随机森林算法中树的增长会给模型带来额外的随机性。与决策树不同的是,每个节点被分割成最小化误差的最佳指标,在随机森林中我们选择随机选择的指标来构建最佳分割。因此,在随机森林中,仅考虑用于分割节点的随机子集,甚至可以通过在每个指标上使用随机阈值来使树更加随机,而不是如正常的决策树一样搜索最佳阈值。这个过程产生了广泛的多样性,通常可以得到更好的模型。

4.项目实施步骤

4.1理解数据

 导入第三方库并加载数据集

查看数据大小

查看数据基本信息

查看数值型变量的描述性统计

查看非数值型变量的描述性统计

4.2探索性数据分析

 

前五名是:

1 -三星

2-Xiaomi

3-Apple

4-Realme

5-OPPO

平均价格最高的前5款智能手机是:

1-Apple

2-Lenovo

3-Asus

4-Realme

5-Samsung

智能手机的价格因内存类别的不同而有很大差异。

4.3特征工程

去除掉无关变量,并删除数据中的缺失值

对非数值型变量进行编码处理

准备建模数据并拆分数据集为训练集和测试集 

4.4模型构建

定义一个训练模型并对模型各个指标进行评估的函数

我们以模型准确率和R方值为评价指标,可以看出决策树的准确率最高,随机森林排第二高,但是随机森林模型的R方比决策树大的多,所以综合评价,我们最终选择随机森林模型作为最终模型。

4.5模型评估

打印随机森林模型的特征重要性

从特征重要性来看,影响手机价格程度最大的是运行内存大小。 

4.6模型预测

5.实验总结

心得与体会:

通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。

在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等

在此次实战中,我还学会了下面几点工作学习心态:

1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。

2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。

3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。

这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。

源代码

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style("whitegrid")
from scipy.stats import f_oneway
import warnings
warnings.filterwarnings('ignore')

df = pd.read_csv("smartphones.csv")
df.head()
df.shape
df.info()
df.describe()
df.describe(include='O')
df.isnull().sum()
df.duplicated().sum()
# df.dropna(inplace=True)
# df.isnull().sum()
# 价格分布
sns.histplot(data=df,x='Final Price',kde=True)
plt.show()
# 各品牌手机的价格箱线图
plt.figure(figsize=(12,14))
sns.boxplot(data=df,x='Final Price',y='Brand')
plt.show()
# 各颜色手机的价格箱线图
plt.figure(figsize=(10,12))
sns.boxplot(data=df,x='Final Price',y='Color')
plt.show()
sns.set_palette("RdBu")
plt.title("Distribute of RAM")
sns.countplot(data = df ,x="RAM")
plt.xlabel("Type of Ram")
plt.ylabel("Count")
plt.show()
sns.set_palette("RdBu")
plt.title("Distribute of Storage")
sns.countplot(data = df ,x="Storage")
plt.xlabel("Type of Storage")
plt.ylabel("Count")
plt.show()
# 智能手机品牌在数据集中的分布情况如何?
plt.figure(figsize=(10,5))
plt.title("Top 10 Brands")
figure = sns.barplot(x=df.Brand.value_counts()[0:10].index ,y= df.Brand.value_counts()[0:10].values)
plt.xlabel("Brands")
plt.ylabel("Frequance")
plt.show()
前五名是:
1 -三星
2-Xiaomi
3-Apple
4-Realme
5-OPPO
# 哪个智能手机品牌的平均价格最高?
fig ,ax =plt.subplots(nrows=1 ,ncols= 2 ,sharex=True, figsize=(20,10) )
fig.set_label("avg.Price of Brand")

#ax[0]
figure = sns.barplot(x =df.groupby("Brand")["Final Price"].mean().sort_values(ascending=False).round(3)[0:5].index ,
            y=df.groupby("Brand")["Final Price"].mean().sort_values(ascending=False).round(3)[0:5].values ,
                    ax= ax[1])

ax[0].set_ylabel("avg.Price",fontsize=30)
ax[0].set_xlabel("Brand",fontsize=30)
#ax[1]
ax[0].plot(df.groupby("Brand")["Final Price"].mean().sort_values(ascending=False).round(3)[0:5].index ,
            df.groupby("Brand")["Final Price"].mean().sort_values(ascending=False).round(3)[0:5].values ,
                     "o--")

ax[1].set_ylabel("avg.Price",fontsize=30)
ax[1].set_xlabel("Brand",fontsize=30)
plt.show()
平均价格最高的前5款智能手机是:
1-Apple
2-Lenovo
3-Asus
4-Realme
5-Samsung
# 内存和智能手机的价格之间是否存在关联?
from scipy.stats import f_oneway
cleaned_df = df.dropna(subset=['RAM', 'Final Price'])
storage_categories = cleaned_df['RAM'].unique()
price_arrays = [cleaned_df[cleaned_df['RAM'] == category]['Final Price'] for category in storage_categories]
# 进行单因素方差分析
f_statistic, p_value = f_oneway(*price_arrays)
print("F-statistic:", f_statistic)
print("P-value:", p_value)
智能手机的价格因内存类别的不同而有很大差异。
# 不同品牌的智能手机颜色分布有何不同?
color_counts = df.groupby(['Brand', 'Color']).size().unstack(fill_value=0)
color_counts.plot(kind='bar', stacked=True, figsize=(10, 6))
plt.title('Distribution of Smartphone Colors by Brand')
plt.xlabel('Brand')
plt.ylabel('Count')
plt.xticks(rotation=45, ha='right')
plt.legend(title='Color', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
new_df = df.drop(['Smartphone','Model'],axis=1)
new_df.dropna(inplace=True)
new_df.head()
from sklearn.preprocessing import LabelEncoder

for col in new_df.describe(include='O'):
    new_df[col] = LabelEncoder().fit_transform(new_df[col])
new_df.head()
from sklearn.model_selection import train_test_split
# 准备建模数据
X = new_df.drop('Final Price',axis=1)
y = new_df['Final Price']
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
import seaborn as sns
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False   #解决符号无法显示
sns.set(font='SimHei')
from sklearn.metrics import r2_score,mean_absolute_error,mean_squared_error
import numpy as np
# 定义一个训练模型并对模型各个指标进行评估的函数
def train_model(ml_model):
    print("Model is: ", ml_model)
    model = ml_model.fit(X_train, y_train)
    print("Training score: ", model.score(X_train,y_train))
    predictions = model.predict(X_test)
    r2score = r2_score(y_test, predictions)
    print("r2 score is: ", r2score)
    print('MAE:', mean_absolute_error(y_test,predictions))
    print('MSE:', mean_squared_error(y_test,predictions))
    print('RMSE:', np.sqrt(mean_squared_error(y_test,predictions)))
    # 真实值和预测值的差值
    sns.distplot(y_test - predictions)
# 构建多元线性回归
from sklearn.linear_model import LinearRegression
lg = LinearRegression()
train_model(lg)
# 构建knn回归
from sklearn.neighbors import KNeighborsRegressor
knn = KNeighborsRegressor()
train_model(knn)
# 构建决策树回归
from sklearn.tree import DecisionTreeRegressor
tree = DecisionTreeRegressor()
train_model(tree)
# 构建随机森林回归
from sklearn.ensemble import RandomForestRegressor
forest = RandomForestRegressor()
train_model(forest)
#打印特征重要性评分
feat_labels = X_train.columns[0:]
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1]
index_list = []
value_list = []
for f,j in zip(range(X_train.shape[1]),indices):
    index_list.append(feat_labels[j])
    value_list.append(importances[j])
    print(f + 1, feat_labels[j], importances[j])
plt.figure(figsize=(10,6))
plt.barh(index_list[::-1],value_list[::-1])
plt.yticks(fontsize=12)
plt.title('各特征重要程度排序',fontsize=14)
plt.show()
# 使用随机森林模型预测并可视化
plt.figure(figsize=(10,6))  
y_pred = forest.predict(X_test)
plt.plot(range(len(y_test))[:200],y_pred[:200],'b',label='预测值')
plt.plot(range(len(y_test))[:200],y_test[:200],'r',label='真实值')
plt.legend(loc='upper right',fontsize=15)
plt.xlabel('the number of phone',fontdict={'weight': 'normal', 'size': 15})
plt.ylabel('value of price',fontdict={'weight': 'normal', 'size': 15})
plt.show()
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐