zoukankan      html  css  js  c++  java
  • San Francisco Crime Classification非数值性多分类问题

    给出了旧金山以往犯罪活动的相关信息,预测特定条件下的犯罪情况

    分析数据集和测试集信息:

    训练集给出的信息有:

    1.Dates:时间日期和时间,这里考虑时间对犯罪活动有影响,日期和下边的周几有相似处,取周几作为特征,因为节日是少数情况

    2.category:犯罪分类,就是实例的标签

    3.descript:对于犯罪的描述,没用的信息

    4.DayOfWeek:周几,可能是有影响的

    5.PdDistrict:地区,重要信息

    6.Resolution:缺失值太多,弃用

    7.Address:分类太多,而且和地区重复,弃用

    8.坐标:和地区重复,弃用

    测试集给出的信息有Dates,DayOfWeek,PdDistrict,Address,坐标

    所以最后的特征选择为:Dates,DayOfWeek,PdDistrict

    这个题的特征比较好选择,所以没有数据分析和可视化的过程,数据特征分析是很重要的能力,但是一直不会,不知道应该用怎么样的模式系统地进行分析。

    这个新手题目最重要的地方我觉得应该是多分类,对于非数值类型的编码处理和朴素贝叶斯算法

    看一下官方给出的提交样例:

    可以看出,最后每个id的结果不是直接显示分类,而是不同的分类显示概率(这也符合生成模型)

    解题过程和代码:

    1.导包

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from sklearn.naive_bayes import BernoulliNB
    from sklearn.metrics import log_loss
    from sklearn.model_selection import train_test_split

    2.数据处理,主要是读文件、对非数值类型进行编码,组合特征(特征筛选这次基本没有)

    # 读入文件,并指定第一列为日期时间
    train = pd.read_csv('train.csv', parse_dates=['Dates'])
    test = pd.read_csv('test.csv', parse_dates=['Dates'])
    # 分类
    cate = train['Category']
    '''
    离散特征的编码分为两种情况:
    
    1、离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就使用one-hot编码
    
    2、离散特征的取值有大小的意义,比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}
    '''
    # 对区域和星期几和时间进行独热编码
    days = pd.get_dummies(train['DayOfWeek'])
    dist = pd.get_dummies(train['PdDistrict'])
    # 以后时间格式的数据可以在一开始就指定出那一列是时间数据,然后通过下边的方法提取时间或者日期,就不用自己进行提取了
    hour = train.Dates.dt.hour
    hour = pd.get_dummies(hour)
    
    # 组合特征
    # 可以将刚才处理好的一列数据直接添加到数据新建的一个列
    # 也可以用pandas的concat()函数,其中参数axis为0时是把列相同的多行数据进行收尾拼接,axis=1时是将多列进行拼接
    trainData = pd.concat([days, dist, hour], axis=1)
    trainData['cate'] = cate
    
    # 对测试数据进行处理
    # 经过get_dummies()进行one-hot处理后series会变成dataframe,列就是原来series中的各类数据
    days = pd.get_dummies(test['DayOfWeek'])
    dist = pd.get_dummies(test['PdDistrict'])
    # 提取出时间信息,记住这个Dates数据的方法
    hour = test.Dates.dt.hour
    hour = pd.get_dummies(hour)
    # pandas库中的concat方法是将DataFrame拼接,当axis=0时将行拼接,当axis=1时将列拼接
    testData = pd.concat([days, dist, hour], axis=1)
    features = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday',
                'BAYVIEW', 'CENTRAL', 'INGLESIDE', 'MISSION',
                'NORTHERN', 'PARK', 'RICHMOND', 'SOUTHERN', 'TARAVAL', 'TENDERLOIN']
    hou = [x for x in range(24)]
    features = features + hou

    3.交叉验证

    # 交叉验证
    # 训练数据和测试数据分离
    training,validation = train_test_split(trainData,train_size=0.6)
    # 建立模型
    bayes = BernoulliNB()
    bayes.fit(training[features],training['cate'])
    # 测试集预测,计算错误率
    # predict_proba返回一个矩阵,矩阵每一行对应每个实例,一行中的各个float代表判为各个分类的概率
    predict = np.array(bayes.predict_proba(validation[features]))
    result = pd.DataFrame(predict,columns=bayes.classes_)
    # log_loss要求参数都是one-hot编码
    print log_loss(validation['cate'],predict)

    4.建模预测

    # 伯努利朴素贝叶斯
    bayes = BernoulliNB()
    bayes.fit(trainData[features], trainData['cate'])
    predict = np.array(bayes.predict_proba(testData[features]))
    result = pd.DataFrame(predict, columns=bayes.classes_)
    result.to_csv('result.csv', index=True, index_label='Id')
  • 相关阅读:
    ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考
    ASP.NET Core 中文文档 第四章 MVC(3.1)视图概述
    ASP.NET Core 中文文档 第四章 MVC(2.3)格式化响应数据
    ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证
    ASP.NET Core 中文文档 第四章 MVC(2.1)模型绑定
    ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览
    mysql 解除正在死锁的状态
    基于原生JS的jsonp方法的实现
    HTML 如何显示英文单、双引号
    win2008 r2 服务器php+mysql+sqlserver2008运行环境配置(从安装、优化、安全等)
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8276821.html
Copyright © 2011-2022 走看看