机器学习项目开发步骤及实战一

130 阅读5分钟

机器学习项目开发步骤包括以下五个部分:

  1. 项目需求:无论传统应用项目还是AI项目,首先需要对项目需求进行深入了解。
  2. 数据来源:在了解需求后,需要明确完成项目所需数据的来源。
  3. 数据预处理:对数据进行清洗、处理和转换,为特征工程做准备。
  4. 特征工程:对数据进行特征的构建、提取和选择,以供模型使用。
  5. 算法选择与模型评估:选择适合需求的算法,进行模型训练,并通过参数优化调整模型效果,最后进行模型的评估。

数据预处理主要包括数据质量的分析、缺失值和异常值的处理、数据清洗和格式转换等,目的是提高数据的质量和可用性。

特征工程主要包括特征的构建、提取和选择,旨在提取出对模型预测有用的特征,并去除无关或冗余的特征。

机器学习项目开发实战一:二手车价格预测

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()

image.png

dataset.describe()

image.png

tag_list=list()
dataset['tag'].apply(lambda x:tag_list.extend(x.split("_")))
tag_list=list(set(tag_list))
tag_list

image.png

这段代码的意思是:

  1. 创建一个空列表 tag_list,用于存储从 tag 列中提取的所有标签。

  2. 使用 apply 方法和 lambda 函数,对 tag 列中的每个元素进行操作:

    • 将每个元素按下划线 _ 分割成多个子串。
    • 将这些子串添加到 tag_list 中。
  3. 将 tag_list 转换为集合(set),以去除重复的标签。

  4. 最终得到一个包含数据集中所有唯一标签的列表 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()

image.png 这段代码的意思是:

  1. 创建一个新的 DataFrame tag_df,其中包含了列名为 tag_list 中唯一标签的列,这些列的初始值为 NaN。

  2. 使用 pd.concat() 函数将原始数据集 dataset 与新创建的 tag_df 沿列方向合并,生成一个新的 DataFrame df,其中包含了原始数据集的内容以及新的标签列。

  3. 使用 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()

image.png

这段代码的意思是:

  1. 定义了一个函数 set_tag_status(series),该函数接受一个 Series 对象作为输入,将 tag 列中的标签按下划线分割,并将每个标签作为新的列,列值设为1。
  2. 使用 apply() 方法,对 df DataFrame 中的 ['tag', *tag_list] 这些列应用 set_tag_status 函数,axis=1 表示按行进行操作。
  3. 在应用函数后,删除原始的 tag 列,以保留处理后的标签列。
  4. 最后,显示处理后的 DataFrame 的前几行数据。
#删除标题
df=df.drop('title',axis=1)
#分析平均价格最高的前10个品牌
num_top=df.groupby('brand')['price'].mean().sort_values(ascending=False)[:10]
num_top

image.png

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()

image.png

#销量分析 销量最多的前十个品牌
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()

image.png

#各大品牌车系数量占有比重  前10
fig=plt.figure()
plt.pie(num_top,labels=num_top.index,autopct="%1.2f%%")
plt.title("各大品牌车系数量占有比重前10位")
plt.show()

image.png

#对大众车价格进行分区并显示各分区的概念
df_dazhong=df[df['brand']=='大众']
df_dazhong.head()

image.png

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()

image.png

这段代码的意思是:

  1. 计算大众汽车价格列 "price" 的平均值 dazhong_mean 和标准差 dazhong_std
  2. 定义直方图的 bin 数量 num_bins
  3. 使用 plt.hist() 绘制价格数据的直方图,并设置参数 density=True 以绘制归一化的直方图,facecolor='green' 设置颜色,alpha=0.5 设置透明度。
  4. 计算正态分布曲线的 y 值,根据平均值和标准差计算每个 bin 的概率密度值。
  5. 使用 plt.plot() 绘制红色虚线表示的正态分布拟合曲线。
  6. 添加 x 轴和 y 轴标签,设置标题显示价格直方图的平均值和标准差。
  7. 使用 plt.subplots_adjust(left=0.15) 调整子图的位置,确保标题不会被截断。
  8. 最后通过 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()

image.png

#建模
#数据准备
X=df[df.columns.difference(['price'])].values
Y=df['price'].values

这段代码的意思是:

  1. 从 DataFrame df 中选择所有列,除了名为 'price' 的列作为特征列,将这些特征列的值存储在 X 中。
  2. 从 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)

这段代码通过使用梯度提升回归模型对价格进行训练和预测。

  1. train_test_split 函数用于将数据集 X 和标签 Y 划分为训练集和测试集。其中,test_size=0.3 表示测试集占总数据集的30%,random_state=6 是随机种子,确保每次运行划分的结果一致。
  2. 创建梯度提升回归模型对象 gbdt,并设置 n_estimators=70,表示使用70个基本估计器(即决策树)来构建梯度提升模型。
  3. 使用训练集 x_train 和对应的标签 y_train 来训练梯度提升回归模型,通过 gbdt.fit(x_train, y_train) 实现。
  4. 使用训练好的模型对测试集 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

image.png

#评估
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))

image.png