知識點(diǎn):
unique去重
logistic回歸glm命令
kaggle的案例網(wǎng)址:https://www.kaggle.com/c/sf-crime
提供舊金山2003-2015年88萬行的犯罪記錄,包括日期晒他,犯罪類型逸贾,地區(qū),警區(qū)灼伤,處置辦法,地址等狐赡。
要求:根據(jù)train的記錄嗜诀,預(yù)測test犯罪集的數(shù)據(jù)類別。
這里的數(shù)據(jù)雖然有88w行之多发皿,但是指標(biāo)只有9個拂蝎,并不算特別復(fù)雜。課程使用邏輯回歸來做温自。
背景理論:
Logistic回歸與多重線性回歸都?xì)w于同一個家族,即廣義線性模型(generalizedlinear model)松捉。
這一家族中的模型形式基本類似馆里,不同的就是因變量不同。
如果是連續(xù)的鸠踪,就是多重線性回歸;
如果是二項(xiàng)分布营密,就是Logistic回歸;
如果是泊松分布纷捞,就是泊松回歸被去;
Logistic回歸的因變量可以是二分類的,也可以是多分類的编振,實(shí)際中最常用的就是二分類的Logistic回歸
此外:
Logistic回歸模型的適用條件
1 因變量為二分類的分類變量或某事件的發(fā)生率,并且是數(shù)值型變量臀玄。但重復(fù)計數(shù)現(xiàn)象指標(biāo)不適用于Logistic回歸畅蹂。
2 殘差和因變量都要服從二項(xiàng)分布。二項(xiàng)分布對應(yīng)的是分類變量液斜,所以不是正態(tài)分布叠穆,進(jìn)而不是用最小二乘法臼膏,而是最大似然法來解決方程估計和檢驗(yàn)問題。
3 各觀測對象間相互獨(dú)立
首先加載包和文件
library(MASS)
library(readr)
library(caret)
library(ggplot2)
library(lubridate)
setwd("E:")
train<-read_csv("sf_train.csv")
test<-read_csv("sf_test.csv")
head(train)
然后用lubridate包的命令渗磅,將日期分成年月時間等幾組變量。這里做了一個函數(shù)仔掸,用函數(shù)帶入train和test兩個文件医清。
make_feature<-function(df){
Dates1<-strptime(as.character(df$Dates),"%Y-%m-%d %H:%M:%S")
df$Year<-year(Dates1)
df$Month<-month(Dates1)
df$Hour<-hour(Dates1)
return(df)
}
train<-make_feature(train)
head(train)
test<-make_feature(test)
head(test)
這時候train和test就會多了幾列時間參數(shù)。
第三步鞋怀,設(shè)置兩個空數(shù)據(jù)框,第一個submission是要提交文件密似,變量與test的相同葫盼,第二個response的變量是train文件里犯罪種類。
submission<-data.frame(Id=test$Id)
response<-data.frame(Cat=train$Category)
#此處用unique將犯罪種類去重
crime<-as.character(unique(train$Category))
crime<-sort(crime)
贫导。
設(shè)置一個循環(huán)孩灯,每次犯罪類型相同時,賦值為1峰档,否則為0.
之后將其與train的其他變量進(jìn)行線性回歸,類型為二項(xiàng)分布
for(i in crime){
response[,i]<-0
response[,i][response$Cat==i]<-1
fit<-glm(response[,i]~PdDistrict+DayOfWeek+Year+Month+Hour+X:Y,
data=train,family=binomial)
pred<-predict(fit,test,type="response")
submission[i]<-pred
}
這個參數(shù)能用在binomial數(shù)據(jù),也就是響應(yīng)變量是二分型的時候,這個參數(shù)選成type=response,表示輸出結(jié)果預(yù)測響應(yīng)變量為1的概率掀亩。
(老師注:response[,i] 就是把稠密矩陣變?yōu)橄∈杈仃?
最后檢查一下欢顷,寫入csv文件。大功告成炼七。
head(submission)
write.csv(submission,"submission_criminal.csv",row.names=F)
相應(yīng)的可視化,表示某類犯罪的發(fā)生點(diǎn)豌拙。不過因?yàn)槭莋ooglemap,要翻墻姆蘸。
map<-get_map("San Francisco",zoom=12,color="bw")
plot(map)
map_crime<-function(crime_df,crime){
filtered<-filter(crime_df,Category %in% crime)
plot<-ggmap("San Francisco",zoom=12,color="bw",extent='device')
+geom_point(data=filtered,aes(x=X,y=Y,color=Category),alpha=0.6)
return(plot)
}
map_crime(train,c('SUICIDE','ARSON'))
雖然是簡單的線性回歸逞敷,但要把參數(shù)用對用好也不容易,尤其對于數(shù)學(xué)功底不深的小白我來說推捐,而且還有許多其他相關(guān)的處理侧啼,也是有挑戰(zhàn)性的新內(nèi)容。
多做筆記痊乾,多做功課,日拱一卒蛾魄。
來自煉數(shù)成金聽課比較湿滓,代碼有些小修改滴须。