如何使用multinomial logistic regression模型预测下一起犯罪的发生社区
问题背景
我希望基于城市各社区的社会经济指标对不同社区的犯罪发生情况进行分类,最终目标是生成合理准确的预测,给出下一起犯罪最可能发生的社区。我选择拟合multinomial regression(多项逻辑回归)模型,目前在结果解读上遇到困难。
数据结构
> str(df) 'data.frame': 1796 obs. of 12 variables: $ Time : chr "14:37:00" "14:37:00" "16:23:00" "00:10:00" ... $ Neighbourhood : chr "Grand Boulevard" "Grand Boulevard" "West Town" "West Englewood" ... $ Population : num 22209 22209 84698 26346 24976 ... $ Area : num 1.74 1.74 4.58 3.15 2.55 2.95 3.15 1.04 7.15 1.28 ... $ Density : chr "12,763.79" "12,763.79" "18,493.01" "8,363.81" ... $ Crowded.Housing: num 3.3 3.3 2.3 4.8 2.7 3.3 4.8 2.4 6.3 9.4 ... $ Poverty : num 29.2 29.3 14.7 34.4 8.9 27.8 34.4 21.7 28.6 41.7 ... $ Unemployment : num 24.3 24.3 6.6 35.9 9.5 24 35.9 15.7 22.6 25.8 ... $ Education : num 15.9 15.9 12.9 26.3 18.8 14.5 26.3 11.3 24.4 24.5 ... $ Age : num 39.5 39.5 21.7 40.7 37.6 40.3 40.7 35.4 37.9 43.6 ... $ Income : num 23472 23472 43198 11317 25113 ... $ Hardship : num 57 57 10 89 29 60 89 26 73 92 ...
模型拟合代码
c.nnet = nnet::multinom(Neighbourhood ~ Crowded.Housing + Poverty + Unemployment + Education + Income + Hardship, data = df, MaxNWts = 100000)
模型准确率
> odds <- c.nnet[["fitted.values"]] > pd = predict(c.nnet,type="class") > table = table(df$Neighbourhood, pd); classAgreement(table) $diag [1] 0.6631403 $kappa [1] 0.6451884 $rand [1] 0.9560459 $crand [1] 0.6035169 > sum(diag(table))/sum(table) [1] 0.6631403
预测输出示例
>head(pd) [1] Chatham Chatham West Town West Englewood New City Chatham 72 Levels: Albany Park Archer Heights Armour Square Ashburn Auburn Gresham Austin Avalon Park Avondale Belmont Cragin Bridgeport Brighton Park ... Woodlaw > head(odds) Albany Park Archer Heights Armour Square Ashburn Auburn Gresham Austin Avalon Park Avondale Belmont Cragin Bridgeport Brighton Park 1 8.293444e-04 3.078169e-04 3.394213e-04 5.070003e-04 0.0333699087 8.205015e-03 0.0140058699 3.519157e-04 0.0005199967 3.962345e-04 1.796575e-05 2 8.293444e-04 3.078169e-04 3.394213e-04 5.070003e-04 0.0333699087 8.205015e-03 0.0140058699 3.519157e-04 0.0005199967 3.962345e-04 1.796575e-05 3 7.276802e-04 2.796196e-06 1.540627e-03 9.642981e-03 0.0001623333 4.575838e-05 0.0004173684 1.229428e-03 0.0007718075 2.308536e-02 9.021844e-03 4 7.168266e-05 7.869570e-04 1.743114e-05 3.519012e-05 0.0473000895 9.256728e-02 0.0058524740 4.373425e-05 0.0002943829 4.752441e-06 6.214005e-07 5 2.376865e-03 3.647976e-04 3.261888e-03 5.958128e-02 0.0090540446 4.103546e-02 0.0028125946 9.329274e-03 0.0339153709 1.394973e-02 9.034131e-02 6 7.735586e-04 5.958576e-04 2.345032e-04 4.058962e-04 0.0833015893 2.374063e-02 0.0169124221 3.038695e-04 0.0005576943 2.163316e-04 1.263609e-05
具体问题
根据我的理解,odds输出代表每起犯罪属于数据集中72个不同社区的概率,pd代表基于数据集得到的预测类别。我的具体问题是:如何利用这些预测类别生成下一起犯罪可能发生地点的预测,即类似单步时间序列预测的效果?
解决方案
你当前训练的多项逻辑回归模型是基于静态社会经济特征预测犯罪所属社区,本身没有引入时间维度的时序依赖,要实现单步前瞻预测可以按以下步骤操作:
- 仅用现有静态特征做基准预测
直接提取你拟合得到的odds矩阵,按列计算所有历史样本的概率均值,得到每个社区的基准发生概率,排序后取Top N就是无时间维度输入下的最可能发生犯罪的社区。如果要和时间关联,可以先按你数据中的Time字段划分时段(比如上午、下午、凌晨),分组计算各社区在对应时段的平均发生概率,输入你要预测的目标时段,就可以输出对应时段的概率最高的社区。 - 实现真正的时序单步预测
你需要重构数据集加入时序特征,比如:- 每个社区过去1小时/6小时/24小时的犯罪发生次数
- 最近N次犯罪的发生社区序列特征
重构后把目标设置为下一次犯罪的社区,再重新训练模型,预测时输入最近的时序特征和社区静态特征,调用predict(c.nnet, newdata = 你的预测输入特征表, type = "probs")得到所有社区的预测概率,取概率最高的社区即为下一次犯罪的最可能发生地点。
- 优化建议:你当前的模型准确率约66%,可以尝试把人口、密度这类社区基础特征也加入特征集,同时把时间字段拆分为小时、工作日/休息日的衍生特征加入训练,能进一步提升预测精度。
内容的提问来源于stack exchange,提问作者Keith Cozart
相关产品推荐
相关产品推荐

