#Kaggle比赛之"旧金山犯罪分类预测"
#导入相应的包
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.naive_bayes import BernoulliNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import log_loss
pd.set_option('display.max_columns', None) # 设置显示最大列,None为显示所有列
#----------------------------2、导入数据集--------------------------
train=pd.read_csv('../MLinAction_source/Kaggle/train.csv',parse_dates=['Dates'])
test=pd.read_csv('../MLinAction_source/Kaggle/test.csv',parse_dates=['Dates'],index_col=0)
#数据集中每一列的含义
'''
Date:日期
Category:犯罪类型(标签)
Descript:对犯罪更详细的描述
DayOfWeek:星期几
PdDistrict:所属警区
Resolution:处理结果
Address:发生街区位置
X and Y:GPS坐标
'''
#----------------------------3、特征预处理--------------------------
#sklearn.preprocessing模块中LabelEncoder函数可以对类别做编号
#对犯罪类别:Category;用LabelEncoder进行编号
leCrime=LabelEncoder()
crime=leCrime.fit_transform(train.Category) #39种犯罪类型 把犯罪类型变成数字 1-39
# print('--处理后的crime字段--:\n',crime)
#用get_dummies因子化星期几、街区、小时等特征
days=pd.get_dummies(train.DayOfWeek) #所在星期几就为1 其他为0
# print('--处理后的DayOfWeek--:\n',days.head())
district=pd.get_dummies(train.PdDistrict) #所属警区就为1 其他为0
# print('--处理后的PdDistrict--:\n',district.head())
hour=train.Dates.dt.hour
hour=pd.get_dummies(hour) #所属小时就为1 其他为0
# print('--处理后的hour--:\n',hour.head())
#组合特征形成训练集
trainData=pd.concat([hour,days,district],axis=1) #将特征将进行左右拼接 axis=0为上下拼接
trainData['cirme']=crime #追加标签列
# print('--处理后的trainData--:\n',trainData.head())
#得到测试集
days=pd.get_dummies(test.DayOfWeek)
district=pd.get_dummies(test.PdDistrict)
hour=test.Dates.dt.hour
hour=pd.get_dummies(hour)
testData=pd.concat([hour,days,district],axis=1)
# print('--处理后的trainData--:\n',testData.head())
#----------------------------4、切分训练集并建模--------------------------
#切分数据集
X_train,X_test,y_train,y_test=train_test_split(trainData.iloc[:,:-1], #不包含最后一列
trainData.iloc[:,-1], #只要最后一列-->标签
test_size=0.2)
#----------------------------5、训练模型--------------------------
BNB=BernoulliNB()
BNB.fit(X_train,y_train)
#----------------------------6、计算损失函数--------------------------
propa=BNB.predict_proba(X_test)
logLoss=log_loss(y_test,propa)
print("损失:",logLoss)
#----------------------------7、使用模型预测testData--------------------------
print(BNB.predict(testData))
旧金山犯罪分类数据集:
链接
提取码:1gh8