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

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

训练集给出的信息有:

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')

San Francisco Crime Classification非数值性多分类问题的更多相关文章

  1. 微软BI 之SSAS 系列 - 多维数据集中度量值设计时的聚合函数 (累加性_半累加性和非累加性)

    在 SSAS 系列 - 实现第一个 Cube 以及角色扮演维度,度量值格式化和计算成员的创建 中主要是通过已存在的维度和事实数据创建了一个多维数据集,并同时解释了 Role-Playing Dimen ...

  2. 写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串

    写出将字符串中的数字转换为整型的方法,如:"as31d2v"->312,并写出相应的单元测试,输入超过int范围时提示不合法输入. public struct Convert ...

  3. AWS Summit 2014 San Francisco站总结

    我上个月去San Francisco参加了AWS Summit 2014 会议,总结一下参加这个会议的情况. 什么是AWS Summit? AWS Summit 是AWS在全球各地举办的,针对AWS用 ...

  4. iOS 9之New System Fonts(San Francisco 字体)

    金田 此次苹果发布的iOS 9系统测试版目前已经开放下载,新系统将弃用Helvetica字体,改用了San Francisco字体, 包括系统菜单.App名称等各个部分. 最初San Francisc ...

  5. 在JS中如何判断所输入的是一个数、整数、正数、非数值?

    1.判断是否为一个数字: Number(num)不为 NaN,说明为数字 2. 判断一个数为正数: var num=prompt("请输入:"); if(Number(num)&g ...

  6. 在javaScript中把非数值类型的数据自动转换为数值类型的两种方式

    一.使用Number()函数. 二.使用parseInt()/parseFloat()函数. 详情: 一.使用Number()函数将非数值类型的数据自动的转化为数组类型 Number()函数可以将任何 ...

  7. [转]React表单无法输入原因----约束性和非约束性组件

    转自:http://blog.csdn.net/lihongxun945/article/details/46730835 表单是前端非常重要的一块内容,并且往往包含了错误校验等逻辑. React对表 ...

  8. js非数值的比较

    /** * 非数值的比较: * 1.对于非数值的比较时,会将其转换成数字然后再比较 * 2.如果符号两端是字符串的值进行比较时,不会将其转换为数字进行比较,而是 * 分别比较字符串中的字符的 unic ...

  9. 七、React表单详解 约束性和非约束性组件 input text checkbox radio select textarea 以及获取表单的内容

    一.约束性和非约束性组件: 非约束性组: MV: <input type="text" defaultValue="a" /> 这个 default ...

随机推荐

  1. 03-Python里字符串的常用操作方法二

    1.lstrip():删除左侧空白字符 实例: my_str = ' hello world and my and test and python ' # 原始字符串 print(my_str) # ...

  2. 转载的一篇文章eclipse添加插件

    eclipse没有(添加)"Dynamic Web Project"选项的方法 转载海边的第八只螃蟹 最后发布于2015-11-24 21:24:15 阅读数 40814  收藏 ...

  3. JDK7HashMap

    JDK7HashMap 成员变量 HashMap中定义了非常多的成员变量以及常量,各成员变量含义具体如下: //默认初始化长度-16 static final int DEFAULT_INITIAL_ ...

  4. python下载三方库源地址修改

    临时使用 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 默认使用 windows系统使用cmd快速设置 pi ...

  5. CPU:网卡老哥,你到底怎么工作的?

    阿Q造访 我是一个网卡,居住在一个机箱内的主板上,负责整台计算机的网络通信,要是没有我,这里就成了一个信息孤岛了,那也太无聊了- 上个周末,服务器断电维护了,这是我难得的休息时间,我准备打个盹儿眯一会 ...

  6. python学习第五天 ----- 函数

    1. 内置函数 例如: print, round 2.自定义函数: 通过def来定义 def funcname(parameter_list): pass ⑴.参数parameter_list可以没有 ...

  7. 【NOIP2017提高A组模拟9.17】猫

    [NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...

  8. 对于Web开发最棒的22个Visual Studio Code插件

    翻译    原文作者:James Quick    原文地址:https://scotch.io/bar-talk/22-best-visual-studio-code-extensions-for- ...

  9. [从源码学设计]蚂蚁金服SOFARegistry之消息总线异步处理

    [从源码学设计]蚂蚁金服SOFARegistry之消息总线异步处理 目录 [从源码学设计]蚂蚁金服SOFARegistry之消息总线异步处理 0x00 摘要 0x01 为何分离 0x02 业务领域 2 ...

  10. PyQt(Python+Qt)学习随笔:Qt Designer中部件与国际化有关的设置translatable、 disambiguation和comment含义

    在Qt Designer的部件的多个属性中,如toolTip.whatsThis.accessibleName.accessibleDescription.text等都有国际化属性设置,国际化属性有三 ...