机器学习otto案例介绍(代码片段)

ZSYL ZSYL     2022-12-10     454

关键词:

1. 背景介绍

奥托集团是世界上最⼤的电⼦商务公司之⼀,在20多个国家设有子公司。该公司每天都在世界各地销售数百万种产品, 所以对其产品根据性能合理的分类非常重要。

不过,在实际工作中,工作人员发现,许多相同的产品得到了不同的分类。本案例要求,你对奥拓集团的产品进行正确的分类。尽可能的提供分类的准确性。

链接:https://www.kaggle.com/c/otto-group-product-classification-challenge/overview

2. 数据集介绍

  • 本案例中,数据集包含大约200,000种产品的93个特征。
  • 其目的是建立⼀个能够区分otto公司主要产品类别的预测模型。
  • 所有产品共被分成九个类别(例如时装,电子产品等)。

在这里插入图片描述

  • id - 产品id
  • feat_1, feat_2, …, feat_93 - 产品的各个特征
  • target - 产品被划分的类别

3. 评分标准

本案例中,最后结果使⽤多分类对数损失进行评估。

具体公式:

在这里插入图片描述

  • i表示样本,j表示类别。Pij代表第i个样本属于类别j的概率,
  • 如果第i个样本真的属于类别j,则yij等于1,否则为0。
  • 根据上公式,假如你将所有的测试样本都正确分类,所有pij都是1,那每个log(pij)都是0,最终的logloss也是0。
  • 假如第1个样本本来是属于1类别的,但是你给它的类别概率pij=0.1,那logloss就会累加上log(0.1)这⼀项。我们知 道这⼀项是负数,而且pij越小,负得越多,如果pij=0,将是无穷。这会导致这种情况:你分错了⼀个,logloss就是无穷。这当然不合理,为了避免这⼀情况,我们对非常小的值做如下处理:

在这里插入图片描述

  • 也就是说最小不会小于10^-15。

3.实现过程

  • 获取数据
  • 数据基本处理
    • 数据量比较大,尝试是否可以进⾏数据分割
    • 转换目标值表示方式
  • 模型训练
    • 模型基本训练

4. 数据获取

data = pd.read_csv('./data/otto/train.csv')

在这里插入图片描述

data.shape
(61878, 95)
data.describe()

在这里插入图片描述

图形可视化,查看数据分布

# 图形可视化,查看数据分布
import seaborn as sns

sns.countplot(data.target)

plt.show()

在这里插入图片描述

data.target

在这里插入图片描述

data.groupby(by='target').count()

在这里插入图片描述

5. 数据基本处理

数据已经经过脱敏,不需要特殊处理

5.1 截取部分数据

new_data = data[:10000]

使用上面截取不可行,然后使用随机欠采样获取相应的数据

# 随机欠采样获取数据
# 首先确定特征值/标签值

y = data['target']
x = data.drop(['id', 'target'], axis=1)  # axis=1按列删除

在这里插入图片描述

# 随机欠采样获取数据
from imblearn.under_sampling import RandomUnderSampler

rus = RandomUnderSampler(random_state=0)

x_resampled, y_resampled = rus.fit_resample(x, y)
x_resampled.shape, y_resampled.shape
((17361, 93), (17361,))
sns.countplot(y_resampled)

plt.show()

在这里插入图片描述

5.2 把标签值转换为数字

y_resampled.head()
0    Class_1
1    Class_1
2    Class_1
3    Class_1
4    Class_1
Name: target, dtype: object
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

y_resampled = le.fit_transform(y_resampled)
y_resampled
array([0, 0, 0, ..., 8, 8, 8])

5.3 分割数据

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_resampled, y_resampled, test_size=0.2)
x_train.shape, y_train.shape
((13888, 93), (13888,))

6. 模型训练

6.1 基本模型训练

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(oob_score=True)
rf.fit(x_train, y_train)
RandomForestClassifier(oob_score=True)
y_pre = rf.predict(x_test)
y_pre
array([0, 1, 6, ..., 6, 2, 1])
rf.score(x_test, y_test)
0.7857759861790958
rf.oob_score_  # 带外估计
0.7603686635944701
# 图形可视化,查看数据分布
import seaborn as sns

sns.countplot(y_pre)

plt.show()

在这里插入图片描述

# logloss模型评估
from sklearn.metrics import log_loss

log_loss(y_test, y_pre, eps=1e-15, normalize=True)

在这里插入图片描述

上面报错原因:logloss使用过程中,必须要求将输出用one-hot表示.

需要将这个多类别问题的输出结果通过One-HotEncoder修改如下:

y_test, y_pre
(array([0, 1, 6, ..., 6, 2, 1]), array([0, 1, 6, ..., 6, 2, 1]))
from sklearn.preprocessing import OneHotEncoder

one_hot = OneHotEncoder(sparse=False)

y_test1 = one_hot.fit_transform(y_test.reshape(-1, 1))
y_pre1 = one_hot.fit_transform(y_pre.reshape(-1, 1))
y_test1
array([[1., 0., 0., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 1., 0., 0.],
       ...,
       [0., 0., 0., ..., 1., 0., 0.],
       [0., 0., 1., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.]])
y_pre1
array([[1., 0., 0., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 1., 0., 0.],
       ...,
       [0., 0., 0., ..., 1., 0., 0.],
       [0., 0., 1., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.]])
# logloss模型评估

log_loss(y_test1, y_pre1, eps=1e-15, normalize=True)
7.399035311780471
# 改变预测值的输出模式,让输出结果为百分占比,降低logloss值
y_pre_proba = rf.predict_proba(x_test)
y_pre_proba
array([[0.43, 0.06, 0.06, ..., 0.03, 0.09, 0.18],
       [0.  , 0.62, 0.15, ..., 0.01, 0.  , 0.  ],
       [0.02, 0.1 , 0.13, ..., 0.49, 0.01, 0.15],
       ...,
       [0.15, 0.06, 0.12, ..., 0.36, 0.15, 0.04],
       [0.03, 0.29, 0.35, ..., 0.03, 0.  , 0.02],
       [0.  , 0.6 , 0.35, ..., 0.02, 0.03, 0.  ]])
rf.oob_score_
0.7603686635944701
# logloss模型评估

log_loss(y_test1, y_pre_proba, eps=1e-15, normalize=True)
0.7288362854443927

6.2 模型调优

n_estimators, max_feature, max_depth, min_sample_leaf

6.2.1 确定最优的n_estimators

# 确定n_esimators的取值范围
tuned_parameters = range(10, 200, 10)

# 创建添加accuracy的一个numpy
accuracy_t = np.zeros(len(tuned_parameters))

# 创建添加error的一个numpy
error_t = np.zeros(len(tuned_parameters))

# 调优过程实现
for j, one_parameter in enumerate(tuned_parameters):
    rf2 = RandomForestClassifier(n_estimators=one_parameter, 
                                 max_depth=10, 
                                 max_features=10, 
                                 min_samples_leaf=10, 
                                 oob_score=True, 
                                 random_state=0, 
                                 n_jobs=-1)
    rf2.fit(x_train, y_train)
    # 输出accuracy
    accuracy_t[j] = rf2.oob_score_
    
    # 输出log_loss
    y_pre = rf2.predict_proba(x_test)
    error_t[j] = log_loss(y_test, y_pre, eps=1e-15, normalize=True)
    
    print(error_t)

优化结果过程可视化

# 优化结果过程可视化
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 4), dpi=100)

axes[0].plot(tuned_parameters, error_t)
axes[0].set_xlabel('n_estimators')
axes[0].set_ylabel('error_t')

axes[1].plot(tuned_parameters, accuracy_t)
axes[1].set_xlabel('n_estimators')
axes[1].set_ylabel('accuracy_t')

axes[0].grid(True)
axes[1].grid(True)

plt.show()

在这里插入图片描述

经过图像展示,最后确定n_estimators=175的时候,表现效果不错.

6.2.2 确定最优的max_features

# 确定max_features的取值范围
tuned_parameters = range(5, 40, 5)

# 创建添加accuracy的一个numpy
accuracy_t = np.zeros(len(tuned_parameters))

# 创建添加error的一个numpy
error_t = np.zeros(len(tuned_parameters))

# 调优过程实现
for j, one_parameter in enumerate(tuned_parameters):
    rf2 = RandomForestClassifier(n_estimators=175, 
                                 max_depth=10, 
                                 max_features=one_parameter, 
                                 min_samples_leaf=10, 
                                 oob_score=True, 
                                 random_state=0, 
                                 n_jobs=-1)
    rf2.fit(x_train, y_train)
    # 输出accuracy
    accuracy_t[j] = rf2.oob_score_
    
    # 输出log_loss
    y_pre = rf2.predict_proba(x_test)
    error_t[j] = log_loss(y_test, y_pre, eps=1e-15, normalize=True)
    
    print(error_t)
[1.20648269 0.         0.         0.         0.         0.
 0.        ]
[1.20648269 1.1083663  0.         0.         0.         0.
 0.        ]
[1.20648269 1.1083663  1.07202998 0.         0.         0.
 0.        ]
[1.20648269 1.1083663  1.07202998 1.05387667 0.         0.
 0.        ]
[1.20648269 1.1083663  1.07202998 1.05387667 1.04638684 0.
 0.        ]
[1.20648269 1.1083663  1.07202998 1.05387667 1.04638684 1.04601271
 0.        ]
[1.20648269 1.1083663  1.07202998 1.05387667 1.04638684 1.04601271
 1.04106936]
# 优化结果过程可视化
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 4), dpi=100)

axes[0].plot(tuned_parameters, error_t)
axes[0].set_xlabel('max_features')
axes[0].set_ylabel('error_t')

axes[1].plot(tuned_parameters, accuracy_t)
axes[1].set_xlabel('max_features')
axes[1].set_ylabel('accuracy_t')

axes[0].grid(True)
axes[1].grid(True)

plt.show()

在这里插入图片描述

经过图像展示,最后确定max_feature=15的时候,表现效果不错.

6.2.3 确定最优max_depth

# 确定max_depth的取值范围
tuned_parameters = range(10, 100, 10)

# 创建添加accuracy的一个numpy
accuracy_t = np.zeros(len(tuned_parameters))

# 创建添加error的一个numpy
error_t = np.zeros(len(tuned_parameters))

# 调优过程实现
for j, one_parameter in enumerate(tuned_parameters):
    rf2 = RandomForestClassifier(n_estimators=175, 
                                 max_depth=one_parameter, 
                                 max_features=15, 
                                 min_samples_leaf=10, 
                                 oob_score=True, 
                                 random_state=0, 
                                 n_jobs=-1)
    rf2.fit(x_train, y_train)
    # 输出accuracy
    accuracy_t[j] 查看详情  

机器学习集成学习进阶xgboost算法案例分析(代码片段)

目录1xgboost算法api介绍1.1xgboost的安装2xgboost参数介绍2.1通用参数(generalparameters)2.2Booster参数(boosterparameters)2.2.1ParametersforTreeBooster2.2.2ParametersforLinearBooster2.3学习目标参数(taskparameters)3xgboost案例介绍3.1... 查看详情

机器学习svm算法案例:数字识别器(代码片段)

案例:数字识别器1.案例背景介绍2.数据介绍3.案例实现3.1获取数据3.1.1确定特征值\\目标值3.1.2查看具体图像3.2数据基本处理3.2.1数据归一化处理3.2.2数据集分割3.3特征降维和模型训练3.4确定最优模型1.案例背景介绍MNIST(“... 查看详情

机器学习逻辑回归对肿瘤预测(代码片段)

目录1逻辑回归api介绍2案例:癌症分类预测-良/恶性乳腺癌肿瘤预测2.1背景介绍2.2案例分析2.3代码实现2.4小结1逻辑回归api介绍sklearn.linear_model.LogisticRegression(solver=‘liblinear’,penalty=‘l2’,C=1.0)solver可选参数:‘libl... 查看详情

机器学习逻辑回归算法(代码片段)

逻辑回归算法学习目标1.逻辑回归的介绍1.1逻辑回归的应用场景1.2逻辑回归的原理1.2.1输入1.2.2激活函数1.3损失以及优化1.3.1损失1.3.2优化1.4小结2.逻辑回归api介绍3.案例:癌症分类预测-良/恶性乳腺癌肿瘤预测3.1背景介绍3.... 查看详情

机器学习朴素贝叶斯(代码片段)

目录1朴素贝叶斯算法简介2概率基础复习2.1概率定义2.2案例:判断女神对你的喜欢情况2.3联合概率、条件概率与相互独立2.4贝叶斯公式2.4.1公式介绍2.4.2案例计算2.4.3文章分类计算2.5小结3案例:商品评论情感分析2.1api介绍3.... 查看详情

深度学习实战案例:新闻文本分类(代码片段)

深度学习多分类案例:新闻文本分类公众号:机器学习杂货店作者:Peter编辑:Peter大家好,我是Peter~这里是机器学习杂货店MachineLearningGrocery~之前介绍过一个单分类的问题。当每个数据点可以划分到多个类别... 查看详情

深度学习实战案例:新闻文本分类(代码片段)

深度学习多分类案例:新闻文本分类公众号:机器学习杂货店作者:Peter编辑:Peter大家好,我是Peter~这里是机器学习杂货店MachineLearningGrocery~之前介绍过一个单分类的问题。当每个数据点可以划分到多个类别... 查看详情

机器学习梯度下降法应用波士顿房价预测(代码片段)

...实现2.4.1正规方程2.4.2梯度下降法2.5小结1线性回归api介绍机器学习梯度下降算法:https://blog.csdn.net/ZGL_cyy/article/details/127037949sklearn.linear_model.LinearRegression(f 查看详情

机器学习交叉验证和网格搜索案例分析(代码片段)

目录1什么是交叉验证(crossvalidation)1.1分析1.2为什么需要交叉验证2什么是网格搜索(GridSearch)3交叉验证-网格搜索API:4鸢尾花案例增加K值调优5Facebook签到的位置预测5.1数据集介绍5.2步骤分析5.3代码实现6总结1什么是交叉验证(cross... 查看详情

机器学习svm算法数字识别器(代码片段)

目录1SVM算法api1.1SVM算法api综述1.2SVC1.3NuSVC1.4LinearSVC1.5小结2案例:数字识别器2.1案例背景介绍2.2数据介绍2.3案例实现3SVM总结3.1SVM基本综述3.2SVM优缺点1SVM算法api1.1SVM算法api综述SVM方法既可以用于分类(二/多分类),... 查看详情

机器学习集成学习进阶lightgbm算法和案例(代码片段)

目录1lightGBM1.1lightGBM演进过程1.2AdaBoost算法1.3GBDT算法以及优缺点1.4启发2什么是lightGBM3lightGBM原理3.1基于Histogram(直方图)的决策树算法3.2Lightgbm的Histogram(直方图)做差加速3.3带深度限制的Leaf-wise的叶子生长策略3.4直接支持类别特征3.5... 查看详情

深度学习入门案例波士顿房价预测(代码片段)

人工智能,机器学习,深度学习做个简单介绍:三者的关系如图1所示,即:人工智能>机器学习>深度学习。深度学习设计框架:环境查看importpaddleimportnumpyasnpimportosimportmatplotlibimportmatplotlib.pyplotaspltimpor... 查看详情

波士顿房价预测——机器学习入门级案例(代码片段)

一、数据处理1.1数据集介绍本实验使用波士顿房价预测数据集,共506条样本数据,每条样本包含了13种可能影响房价的因素和该类房屋价格的中位数,各字段含义如下表所示:字段名类型含义CRIMfloat该镇的人均犯... 查看详情

机器学习算法:波士顿房价预测|黑马程序员(代码片段)

学习目标:通过案例掌握正规方程和梯度下降法api的使用1案例背景介绍数据介绍   给定的这些特征,是专家们得出的影响房价的结果属性。我们此阶段不需要自己去探究特征是否有用,只需要使用这些特征。到后... 查看详情

k近邻算法简单介绍——机器学习(代码片段)

K近邻算法一.简介二.KNN算法API使用2.1导入Scikit-learn工具2.2k-近邻算法API案例悄悄介绍自己:作者:神的孩子在跳舞本人是快升大四的小白,在山西上学,学习的是python方面的知识,希望能找到一个适合自己的实... 查看详情

[当人工智能遇上安全]3.安全领域中的机器学习及机器学习恶意请求识别案例分享(代码片段)

您或许知道,作者后续分享网络安全的文章会越来越少。但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个《当人工智能遇上安全》系列博客,详细介绍人工智能与安全相关的论文... 查看详情

golang学习之路—json(代码片段)

...轻量级的数据交换格式。易与人阅读和编写。同时也易于机器解析和生成。JSON是在2001年开始推广使用的数据格式,目前已经成为主流的数据格式。JSON易于机器解析和生成,并有效地提升网络输出效率&# 查看详情