机器学习项目开发步骤包括以下五个部分:
- 项目需求:无论传统应用项目还是AI项目,首先需要对项目需求进行深入了解。
- 数据来源:在了解需求后,需要明确完成项目所需数据的来源。
- 数据预处理:对数据进行清洗、处理和转换,为特征工程做准备。
- 特征工程:对数据进行特征的构建、提取和选择,以供模型使用。
- 算法选择与模型评估:选择适合需求的算法,进行模型训练,并通过参数优化调整模型效果,最后进行模型的评估。
数据预处理主要包括数据质量的分析、缺失值和异常值的处理、数据清洗和格式转换等,目的是提高数据的质量和可用性。
特征工程主要包括特征的构建、提取和选择,旨在提取出对模型预测有用的特征,并去除无关或冗余的特征。
机器学习项目开发实战一:二手车价格预测
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
dataset=pd.read_csv(r"C:\Users\ljl20\Desktop\ershouche.data.csv")
dataset.head()
dataset.describe()
tag_list=list()
dataset['tag'].apply(lambda x:tag_list.extend(x.split("_")))
tag_list=list(set(tag_list))
tag_list
这段代码的意思是:
-
创建一个空列表
tag_list,用于存储从tag列中提取的所有标签。 -
使用
apply方法和lambda函数,对tag列中的每个元素进行操作:- 将每个元素按下划线
_分割成多个子串。 - 将这些子串添加到
tag_list中。
- 将每个元素按下划线
-
将
tag_list转换为集合(set),以去除重复的标签。 -
最终得到一个包含数据集中所有唯一标签的列表
tag_list。
tag_df=pd.DataFrame(columns=tag_list)
df=pd.concat([dataset,tag_df],sort=False)
df[tag_list]=df[tag_list].fillna(0)
df.head()
这段代码的意思是:
-
创建一个新的 DataFrame
tag_df,其中包含了列名为tag_list中唯一标签的列,这些列的初始值为 NaN。 -
使用
pd.concat()函数将原始数据集dataset与新创建的tag_df沿列方向合并,生成一个新的 DataFramedf,其中包含了原始数据集的内容以及新的标签列。 -
使用
fillna(0)方法将df中的tag_list列中的 NaN 值填充为 0。
#将tag中的数据 处理为数字
def set_tag_status(series):
tag=series['tag'].split("_")
for t in tag:
series[t]=1
return series
df[tag_list]=df[['tag',*tag_list]].apply(lambda x:set_tag_status(x),axis=1).drop("tag",axis=1)
df.head()
这段代码的意思是:
- 定义了一个函数
set_tag_status(series),该函数接受一个 Series 对象作为输入,将tag列中的标签按下划线分割,并将每个标签作为新的列,列值设为1。 - 使用
apply()方法,对dfDataFrame 中的['tag', *tag_list]这些列应用set_tag_status函数,axis=1 表示按行进行操作。 - 在应用函数后,删除原始的
tag列,以保留处理后的标签列。 - 最后,显示处理后的 DataFrame 的前几行数据。
#删除标题
df=df.drop('title',axis=1)
#分析平均价格最高的前10个品牌
num_top=df.groupby('brand')['price'].mean().sort_values(ascending=False)[:10]
num_top
sns.set(font="SimHei")
fig=plt.figure(figsize=(15,10))
sns.barplot(x=num_top.index, y=num_top)
plt.xticks(rotation=90)
fig.show()
#销量分析 销量最多的前十个品牌
num_top= df['brand'].value_counts().sort_values(ascending=False)[:10]
fig=plt.figure()
sns.barplot(x=num_top.index,y=num_top)
plt.xticks(rotation=90)
fig.show()
#各大品牌车系数量占有比重 前10
fig=plt.figure()
plt.pie(num_top,labels=num_top.index,autopct="%1.2f%%")
plt.title("各大品牌车系数量占有比重前10位")
plt.show()
#对大众车价格进行分区并显示各分区的概念
df_dazhong=df[df['brand']=='大众']
df_dazhong.head()
import matplotlib.pyplot as plt
import numpy as np
dazhong_mean = df_dazhong["price"].mean()
dazhong_std = df_dazhong["price"].std()
num_bins = 20
n, bins, patches = plt.hist(df_dazhong['price'], num_bins, density=True, facecolor='green', alpha=0.5)
y = ((1 / (np.sqrt(2 * np.pi) * dazhong_std)) * np.exp(-0.5 * ((bins - dazhong_mean) / dazhong_std) ** 2))
plt.plot(bins, y, "r--")
plt.xlabel("price")
plt.ylabel("probability")
plt.title("Histogram of Price: mean={}, std={}".format(dazhong_mean, dazhong_std))
plt.subplots_adjust(left=0.15)
plt.show()
这段代码的意思是:
- 计算大众汽车价格列 "price" 的平均值
dazhong_mean和标准差dazhong_std。 - 定义直方图的 bin 数量
num_bins。 - 使用
plt.hist()绘制价格数据的直方图,并设置参数density=True以绘制归一化的直方图,facecolor='green'设置颜色,alpha=0.5设置透明度。 - 计算正态分布曲线的 y 值,根据平均值和标准差计算每个 bin 的概率密度值。
- 使用
plt.plot()绘制红色虚线表示的正态分布拟合曲线。 - 添加 x 轴和 y 轴标签,设置标题显示价格直方图的平均值和标准差。
- 使用
plt.subplots_adjust(left=0.15)调整子图的位置,确保标题不会被截断。 - 最后通过
plt.show()显示绘制的直方图和正态分布拟合曲线。
df['start_time']=df['start_time'].apply(lambda x:int(x[:-1]))
df['distance']=df['distance'].apply(lambda x:float(x[:-3]))
df=df[~df['volumn'].str.contains('电动')]
s=set(df['volumn'])
df['volumn']=df['volumn'].apply(lambda x:float(x[:-1]))
df.head()
#建模
#数据准备
X=df[df.columns.difference(['price'])].values
Y=df['price'].values
这段代码的意思是:
- 从 DataFrame
df中选择所有列,除了名为 'price' 的列作为特征列,将这些特征列的值存储在X中。 - 从 DataFrame
df中选择名为 'price' 的列作为目标变量,将其值存储在Y中。
#导包
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
#切分数据集
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.3,random_state=6)
#模型
gbdt=GradientBoostingRegressor(n_estimators=70)
#训练模型
gbdt.fit(x_train,y_train)
pred=gbdt.predict(x_test)
这段代码通过使用梯度提升回归模型对价格进行训练和预测。
train_test_split函数用于将数据集 X 和标签 Y 划分为训练集和测试集。其中,test_size=0.3表示测试集占总数据集的30%,random_state=6是随机种子,确保每次运行划分的结果一致。- 创建梯度提升回归模型对象
gbdt,并设置n_estimators=70,表示使用70个基本估计器(即决策树)来构建梯度提升模型。 - 使用训练集
x_train和对应的标签y_train来训练梯度提升回归模型,通过gbdt.fit(x_train, y_train)实现。 - 使用训练好的模型对测试集
x_test进行预测,通过gbdt.predict(x_test)得到预测结果pred。
result_df=pd.DataFrame(np.concatenate((y_test.reshape(-1,1),pred.reshape(-1,1)),axis=1),columns=['y_pred','y_test'])
result_df
#评估
print("MSE",mean_squared_error(pred,y_test))
print("MAE",mean_absolute_error(pred,y_test))
print("RMSE",np.sqrt(mean_squared_error(pred,y_test)))
print("R2",r2_score(pred,y_test))