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')
  • 相关阅读:
    opencv3.2.0形态学滤波之腐蚀
    Ubuntu下卸载QT5.7.1再重装
    opencv3.2.0形态学滤波之膨胀
    Direct3D中的绘制
    绘制流水线
    初始化Direct3D
    VS2012添加对DirectX SDK中需要文件的引用
    ASCII,Unicode 和通用方式
    对话框访问的7种方式【孙鑫老师教程】
    函数指针
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8276821.html
Copyright © 2011-2022 走看看