Otto Group 数据集
给定Otto Group一些商品的各类特征,需要学习一个模型来判断一个商品所属的类别
Link: https://www.kaggle.com/c/otto-group-product-classification-challenge
题目描述
Otto Group是世界上最大的电子商务公司之一,在全世界范围内,它每天会卖出数百万件商品。每件商品所属的类别分别是Class_1~ Class_9。对于这家公司的来说,货物供给和需求分析是非常重要的信息。现给定一些商品的多个特征,你需要设计一个算法模型来判断一个商品所属的类别。
小提示
- 本题是一个典型的多分类问题
- 先从
train.csv
中提取每个商品的多项特征(feature)和类别(label),使用feature和label进行模型训练 - 商品的每个特征都是数值型,在使用SVM等分类器时注意将数据范围标准化
- 商品的特征较多,在使用Decision Tree等树形分类器时,注意引入正则化项,防止模型过拟合
- 题目要求预测商品属于Class_1~ Class_9的概率,使用深度学习模型,如MLP时,建议在神经网络的最后一层使用softmax函数,使得神经网络的输出与题目要求完全相符
- 最后使用训练好的模型预测
test.csv
中每件商品的类别
先修技能
- 懂得基本的机器学习分类模型的原理和使用,如SVM,Decision Tree等。
- 懂得集成学习的相关算法,如Random Forest,Adaboost等。
- 懂得神经网络的使用,如MLP等。
术语解释
- SVM(支持向量机) : 是一种判别方法。在机器学习领域,支持向量机是一个监督学习模型,通常用来进行模式识别和分类
- Decision Tree(决策树) : 是一种十分常用的机器学习方法。在机器学习领域,决策树是一个监督学习模型,他代表的是对象属性与对象值之间的一种映射关系,通常用来进行分类以及回归分析
- 集成学习(Ensemble Learning) : 是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法
- Random Forest(随机森林) : 指的是利用多棵树对样本进行训练并预测的一种分类器。在机器学习领域,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定
- Adaboost : 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。
- MLP(多层感知机) : 是一种前向结构的人工神经网络,映射一组输入向量到一组输出向量。MLP是感知器的推广,克服了感知器不能对线性不可分数据进行识别的弱点。
输入格式
数据文件train.csv
和test.csv
包含多个商品的信息。每个商品有如下信息:
- id: 每个商品的唯一id
- feat_1 ~ feat_93: 每个商品的93个特征
- target: 商品的真正类别(仅train.csv中包含此信息)
训练数据集(train.csv)包含95列,分别对应上述信息。测试数据集(test.csv)包含94列,不包含target信息。
输出格式
您需要提交一个文件,文件应采用sampleSubmission.csv
的格式,具体如下:对于测试集中的每个商品,输出一行,其中包含商品的id和您预测的其分别属于Class_1 ~ Class_9的概率(要求概率和为1)。 您的提交文件将如下所示:
id,Class_1,Class_2,Class_3,Class_4,Class_5,Class_6,Class_7,Class_8,Class_9
1,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0
2,0.0,0.2,0.3,0.3,0.0,0.0,0.1,0.1,0.0
...
etc.
评价
使用 multi-class logarithmic loss 作为最后评判标准,公式如下:
$$ logloss = -\frac{1}{N}\sum{i=1}^N\sum{j=1}^My{ij}log(p{ij})
$$
其中$$N$$代表测试数据集中的商品数量,$$log$$使用自然对数,$$y{ij}$$表示商品$$i$$是否属于$$class_j$$,如果是则$$y{ij}=1$$,否则为$$0$$。$$p_{ij}$$代表你预测商品$$i$$属于$$class_j$$的概率。
代码与数据
- train : https://github.com/GaoChengliang/MLData/blob/master/Otto/train.csv
- test : https://github.com/GaoChengliang/MLData/blob/master/Otto/test.csv
- correct_submission : https://github.com/GaoChengliang/MLData/blob/master/Otto/otto_correct_submission.csv
完整代码
参考分析
测评配置环境
python
pip install -U scikit-learn
pip install -U numpy
pip install -U pandas
测评代码
import numpy as np
import pandas as pd
from sklearn.metrics import log_loss
test = pd.read_csv("./otto_correct_submission.csv").sort_values('id')
pred = pd.read_csv("./prediction_test.csv").sort_values('id')
test.drop('id', axis=1, inplace=True)
pred.drop('id', axis=1, inplace=True)
loss = log_loss(np.array(test).argmax(axis=1), np.array(pred))