kaggle比赛练习_1: 做的什么菜?(What's Cooking?)

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 05:40   895   0

Kaggle简介

Kaggle是一个数据分析的竞赛平台,网址:https://www.kaggle.com/。企业或者研究者可以将数据、问题描述、期望的指标发布到Kaggle上,以竞赛的形式向广大的数据科学家征集解决方案,类似于KDD-CUP(国际知识发现和数据挖掘竞赛)。Kaggle上的参赛者将数据下载下来,分析数据,然后运用机器学习、数据挖掘等知识,建立算法模型,解决问题得出结果,最后将结果提交,排名前面的可能会获得丰厚的报酬

我们又不是大牛,那么kaggle对于我们有什么意义呢?个人觉得是练习,纸上得来终觉浅,把书本,paper中的机器学习算法,写成代码用于实际问题中,可以提高自己对算法的理解与写代码的能力。(从最简单的开始)工作之余,也要提高自己,所以最近准备在kaggle上做一些题目,也写出来与大家分享讨论。 本博客给出的代码都是准确度一般的实验性代码,排名不会靠前,只做练习分享。

菜品是什么?what’s cooking

训练数据包含,”ID,菜品,菜品,菜的原料”,菜品是要预测的类,菜的原料可以认为是feature. 训练数据只包含“ID, 菜的原料”,需要预测菜品是哪一类。由 Yummly公司提供的真实数据。
问题提供的数据为json格式。

LR解法

本文用多类的逻辑回归算法,采用随即梯度下降法优化,得到了76%的预测准确率。代码如下。
# -*- coding: utf-8 -*-
'''
Created on 2015-9-25

@author: joeyqzhou
'''
import json
import numpy as np
import csv


t_set = set()
x_set = set() #x : feature

learning_rate = 1

alpha = 0.00001 #正则项惩罚系数
iter_time = 5

if __name__ == "__main__":
    with open("train.json") as json_file:
        train_data = json.load(json_file) #list
        N = len(train_data) #number of training data
        for datai in train_data:
            t_set.add(datai['cuisine'])
            for ingredient in datai['ingredients']:
                x_set.add(ingredient)



    K = len(t_set)
    M = len(x_set)
    t_list = list(t_set)
    x_list = list(x_set)

    T = np.zeros([N,K])
    #把分类结果放在一个向量中,K维度
    #那所有N个结果放在T中
    X = np.zeros([N,M])
    for i in range(N):
        datai = train_data[i]
        cuisine_i = datai['cuisine']
        cuisine_i_index = t_list.index(cuisine_i)
        T[i,cuisine_i_index] = 1
        x_i = datai['ingredients']
        for itemj in x_i:
            itemj_index = x_list.index(itemj)
            X[i,itemj_index] = 1



    pass
    #optimization
    #To get W
    W = np.zeros([K,M])
    #initialization
    for i in range(K):
        for j in range(M):
            W[i,j] = np.random.rand(1) -0.5

    #split data randomly  training data
    training_label = np.zeros(N)
    for i in range(N):
        if np.random.rand(1)<1.01: #if split training data to get training:testing data = 9:1, this can be 0.9 
            training_label[i] = 1

    #training
    #Update with each piece of data
    y = np.zeros(K) #prediction y
    for iter in range(iter_time): #迭代3次
        learning_rate = learning_rate*0.1
        print "training: ",iter," time"
        for i in range(N): #each data
            if training_label[i] == 1:
                summ = 0.0
                for j in range(K): #each class
                    y[j] = np.exp( np.dot(W[j],X[i]) )
                    summ += y[j]
                for j in range(K): #normalization
                    y[j] = y[j]/summ

                for j in range(K):
                    W[j] = W[j] - learning_rate*(y[j]-T[i,j])*X[i] - alpha * learning_rate * W[j]


    print "Finish training"



    print "begin testing"
    with open("test.json") as json_file:
        test_data = json.load(json_file) #list
        N_test = len(test_data)


    #把分类结果放在一个向量中,K维度
    #那所有N个结果放在T中

    #open the csv to write
    with open('test_prediction.csv', 'wb') as csvfile:
        fieldnames = ['id' , 'cuisine']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()

        X_test = np.zeros([N_test,M])
        for i in range(N_test):
            datai = test_data[i]
            x_i = datai['ingredients']
            id = datai['id']
            for itemj in x_i:
                if itemj in x_list:
                    itemj_index = x_list.index(itemj)
                    X_test[i,itemj_index] = 1

            #to calculate the prediction y
            for j in range(K):
                y[j] = np.exp( np.dot(W[j],X_test[i]) )
            max_index = y.argmax(axis=0)
            cuisine = t_list[max_index]
            writer.writerow({'id': id, 'cuisine': cuisine})


###If we do not have testing data, we use the splitted training data as testing data          
#    right_count = 0.0
#    all_count = 0.0    
#    y = np.zeros(K) #prediction y    
#    for i in range(N):
#        if training_label[i] == 0:
#            all_count += 1
#            for j in range(K):
#                y[j] = np.exp( np.dot(W[j],X[i]) )
#            max_index = y.argmax(axis=0)
#            if T[i,max_index] == 1:
#                right_count +=1
#    print "precision: ",  right_count/all_count













分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP