給出了舊金山以往犯罪活動的相關信息,預測特定條件下的犯罪狀況算法
分析數據集和測試集信息:函數
訓練集給出的信息有:測試
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')