在lintcode刷AI题:Otto Group 商品识别

lintcode上面有十几道类似于Kaggle的小项目,用于深度学习的入手练习再好不过了,现在就让我们上手这道猫狗分类器的问题吧!

(全程用Keras框架,简单上手!)

本题网址:LintCode

题目描述:

Otto Group是世界上最大的电子商务公司之一,在全世界范围内,它每天会卖出数百万件商品。每件商品所属的类别分别是Class_1~ Class_9。对于这家公司的来说,货物供给和需求分析是非常重要的信息。现给定一些商品的多个特征,你需要设计一个算法模型来判断一个商品所属的类别。

一 下载,处理数据

这道题给出的是约5w个商品的93个特征,这些商品分属9类,要做的是根据93个特征求出这些商品是哪一个类的。

下面让我们先整理数据:将N*93大小的特征数据处理为numpy数组,然后把每样商品的分类改变成9维的one-hot形式(类似于1,0,0,0,0,0,0,0,0代表的是第一类)

def to_one_hot(y):
    y_temp = np.zeros([y.shape[0], 10])  # 转换为one-hot向量
    for i in range(y.shape[0]):
        y_temp[i, y[i]] = 1
    return y_temp

# 读取数据
train_data = pd.read_csv(open("./Otto_Group_商品识别data/train.csv"))
test_data = pd.read_csv(open("./Otto_Group_商品识别data/test.csv"))
print(train_data.info())
train_y_raw = train_data["target"]
x_label = []
for i in range(1,94):
    x_label.append("feat_%s"%(i))
train_x = np.array(train_data[x_label])
test_x = np.array(test_data[x_label])

# 将train_y中形如Class_1的数据转换成one_hot向量,9维
train_y = np.zeros([len(train_y_raw),9])
for i in range(len(train_y_raw)):
    lable_data = int(train_y_raw[i][-1])  # 取最后一个字就行
    train_y[i,lable_data-1] = 1
print(train_x.shape,train_y.shape,test_x.shape)  # (49502, 93) (49502, 9) (12376, 93)

二 建立模型,训练

由于有输入的是93维数据,要转换成9类的分布概率,这里就选取了93->128->64->32->16->9的神经网络,使用relu激活函数,最后一层用softmax将预测值转化为每个分类的概率。

# 构建模型
model = Sequential()
model.add(Dense(128, input_shape=(93,),activation="relu"))
model.add(Dense(64, activation="relu"))
model.add(Dense(32, activation="relu"))
model.add(Dense(16, activation="relu"))
model.add(Dense(9))
model.add(Activation('softmax'))
model.summary()
model.compile(loss='mean_squared_logarithmic_error',optimizer='adadelta',metrics=['accuracy'])
model.fit(x=train_x,y=train_y,batch_size=2048,nb_epoch=200,verbose=1)

三 预测,上传答案

# 预测答案
test_y = model.predict(test_x)
print(test_y.shape)
answer = pd.read_csv(open("./Otto_Group_商品识别data/sampleSubmission.csv"))
class_list = ["Class_1","Class_2","Class_3","Class_4","Class_5","Class_6","Class_7","Class_8","Class_9"]
answer[class_list] = answer[class_list].astype(float)

# 将答案放进去
j = 0
for class_name in class_list:
    answer[class_name] = test_y[:, j]
    j += 1
answer.to_csv("./Otto_Group_商品识别data/submission.csv",index=False)  # 不要保存引索列

最后得分为0.70214,排名12/29(去掉前面一堆loss=0的团队后,7/24),很想吐槽lintcode为什么不管管正确率100%的那些团队?

四 开源

所有代码都在我的github上,下载即运行

猜你喜欢

转载自blog.csdn.net/yuweiming70/article/details/80856003