5.9 旧金山犯罪分析

1. 知识点

所有字段都为离散的,犯罪是有原因的,因素和结果是有概率关系。

2.实现

2.1导包

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.naive_bayes import MultinomialNB, BernoulliNB # 导入多项式分布和伯努利贝叶斯

2.2 导入数据

%time train = pd.read_csv('data/旧金山犯罪分析/train.csv', parse_dates=["Dates"]) # 路径尽可能不用汉语,汉语路径需要解析,难免出问题。 # %time看下读取的时间 Wall time: 3.09 s # parse_dates直接把Dates列转换成时间类型。

字段说明
Date:日期
Category:犯罪类型(标签)
Descript:对于犯罪更详细的描述
DayOfWeek:星期几
PdDistrict:所属警区
Resolution:处理结果
Address:发⽣街区位置
X and Y:GPS坐标
date-time
date
time
train.head()

image.png

2.3 补充:时间类型转换

日期有分组技术,重采样

train.dtypes # 查看每列字段类型,发现Dates列为object类型。 2015-05-13 23:53:00,需要转为时间类型,时间有3种类型:datetime、date,time,此处格式为时间戳,可直接转换datetime。方式如下:

如何把一个字符串(object)转换成时间类型
date = pd.to_datetime(train.Dates)

date[0] # 输出: TimeStamp('2015-05-13 23:53:00')
date[0].date # 输出 datetime.date (2015,5,13)
date[0].time() # 输出 datetime.time(23,53)
date[0].day # 13
date[0].year # 2015
date[0].hour # 23
date[0].minute # 53
date[0].second # 0
date[0].month # 5
"{}年{}月{}日”.format(date[0].year, date[0].month,date[0].day)
还可以算时间差

2.4 特征预处理

2.4.1 补充 哑编码

image.png

2.4.2 特征提取(经验提取)

查看训练集合测试集的字段

  • (1)提取标签列:犯罪类型,进行labelEncoder
    target = train['Category'].copy()

  • (2)把target进行LabelEncoder
    from sklearn.preprocessing import LabelEncoder
    target = LabelEncoder().fit_transform(target)


    image.png

+(3) 查看其它需要编码的离散特征

# pd.get_dummies(test_data)

# 先查看所有数据列,哪些需要做哑编码
for col_name in train.columns:
    if col_name == 'Category':
        continue
    data = train[col_name]
    if data.dtype == 'object':
        print(col_name, data.unique().size)# 去重,查看数据
image.png
  • (4) 读取测试数据,特征选择
    test = pd.read_csv('data/旧金山犯罪分析/test.csv', parse_dates=['Dates'])


    image.png

删除没用的列
test.drop(labels='Id', axis=1, inplace=True)

+(5)字段选择

  • 测试数据中,只有DayOfWeek,PdDistrict,Address几个字段是离散的

  • 我们认为,每一天的犯罪信息,小时是一个非常重要的特点

  • 如果不懂数据特征的含义时的三个建议:与业务人员沟通 与业务人员沟通 与业务人员沟通

建模的字段选择:(经验提取)
*hour DayOfWeek PdDistrict *
def process_features(data):
Hour = data["Dates"].dt.hour
DayOfWeek = pd.get_dummies(data.DayOfWeek)
PdDistrict = pd.get_dummies(data.PdDistrict)

train = pd.concat((Hour, DayOfWeek, PdDistrict), axis=1)
# 行方向的级联,默认纵向级联。
# 合并一般是行方向合并,级联一般是纵向方向级联,
# 级联一般是2张业务表,上月加这个月
# 合并是两张不同的业务表,如:销量表和利润表和产品表, 要依赖某些字段连
return train

先处理训练集 , 提取日期中的小时
train_data = process_features(train)

再处理训练集
test_data = process_features(test)

image.png

2.4.3 拆分样本集

image.png

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(train_data, target, test_size=0.2, random_state=1)

2.4.4 建模评分

image.png

2.4.5查看概率

image.png

即每一个X_test对应的可能的每个目标结果的概率,哪个概率大就预测为某个。

2.4.6 建模并计算损失

image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容