1. 知识点
所有字段都为离散的,犯罪是有原因的,因素和结果是有概率关系。
2.实现
2.1导包
import numpy as np
import pandas as pd
from pandas import Series, DataFrameimport 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()
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 补充 哑编码
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)# 去重,查看数据
-
(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)
2.4.3 拆分样本集
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 建模评分
2.4.5查看概率
即每一个X_test对应的可能的每个目标结果的概率,哪个概率大就预测为某个。