San Francisco Crime Classification非數值性多分類問題

給出了舊金山以往犯罪活動的相關信息,預測特定條件下的犯罪狀況算法

 

分析數據集和測試集信息:函數

訓練集給出的信息有:測試

1.Dates:時間日期和時間,這裏考慮時間對犯罪活動有影響,日期和下邊的周幾有類似處,取周幾做爲特徵,由於節日是少數狀況編碼

2.category:犯罪分類,就是實例的標籤spa

3.descript:對於犯罪的描述,沒用的信息code

4.DayOfWeek:周幾,多是有影響的blog

5.PdDistrict:地區,重要信息ip

6.Resolution:缺失值太多,棄用get

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']
'''
離散特徵的編碼分爲兩種狀況:

一、離散特徵的取值之間沒有大小的意義,好比color:[red,blue],那麼就使用one-hot編碼

二、離散特徵的取值有大小的意義,好比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')
相關文章
相關標籤/搜索