数目字生存

Kaggle实战系列之"San Francisco Crime

2019-06-29  本文已影响0人  askka
San Fransisco city (from Big hero 6)

  根据Nagin 和Johnson 等人的研究结果,尽管犯罪行为与包括犯罪动机、城市环境、可获得的安保措施、受害者目标等诸多因素有关,但其往往与历史数据呈强正相关,因此根据以往的历史数据预测可能的犯罪行为是可行的。事实上,利用时空核密度、时间序列、朴素贝叶斯、决策树、随机森林、K近邻、人工神经网络(ANN)等在内的方法进行犯罪率预测、热点地区预测、犯罪行为分类等,已受到越来越多的关注与重视 。

空间信息预处理

地址特征字段中的异常值与重复值

查看原数据集中地址相关字段(Address、PdDistrict、X、Y)的信息可发现:
  * 经纬度坐标 'X' 和'Y' 精度过高,不仅浪费计算资源,实际上已远远超出分析所需的精度,并无必要。即便当位于赤道位置(纬度为0)时,经纬度坐标小数点后取6位时,已达到米级的距离区分度了;
  * 经纬度坐标 'X' 和'Y'存在异常值(Y=90°)。实际上San Fransisco所在的经纬度范围应在 [-122.5136,-122.3649],[37.70788,37.81998] 之间;

latlng_box = "X>-122.55 and X<-122.35 and Y>37.65 and Y<37.85"
plt.clf()
plt.rcParams['figure.figsize']=(9,9)
sns.pairplot(data_raw[['X','Y']]);
plt.rcParams['figure.figsize']=(9,9)
sns.pairplot(data_raw.query(latlng_box)[['X','Y']]);



  * 地址字段中存在疑似笔误情况,如'JAMESLICKFREEWAY HY / SILVER AV'和'JAMES LICK FREEWAY HY / SILVER AV',或是'9TH ST / MARKET ST'和'MARKET ST / 9TH ST','SPEAR ST / THE EMBARCADEROSOUTH ST'和'STEUART ST / THE EMBARCADERO SOUTH ST'……类似的判断应为同一个地址的不同记录而已;
  * 排除上述疑似笔误情况外,原数据集中相同经纬度坐标下的条目的警局('PdDistrict')与地址('Address'),存在不一致现象。

异常值修正

针对以上问题,对地址字段加以修正:
  1. 经纬度精度调整。将经纬度坐标保留到小数点后6位。用python自带的round()函数四舍五入可能会出现"逢5不进位"的错误,建议采用np.round()或是Decimal来转换。
  2. 笔误地址修正。FuzzyWuzzy工具包中定义了ratio()、partial_ratio()、token_sort_ratio()等函数,对两个字符串的的包含/词序变化/包含等情况进行模糊匹配,并给出模糊匹配度评分;此外还可以利用process.extract(limits=n)从查询的字符串集合中找出模糊匹配得分排名最靠前的n个选项;而process.extractOne()则可以指定模糊匹配的具体方法并给出得分最高的一个选项。
  以出现次数最多的地址'800 Block of BRYANT ST'为例,利用process.extract()查询出与该地址匹配度较高的前40个字符串,模糊匹配度较高的字符串是类似### Block of BRYANT ST'的地址(图中第1部分),其次这是形如800 Block of xxx ST的地址,如图中第2部分所示,其模糊匹配值在[87,90]之间;匹配度在87以下的地址则基本上与源地址没多少关联了。实际上,这里的87可以作为一个判定的阈值。


利用Fuzzywuzzy查找可能存在的地址笔误
  斜线前后街道名称顺序不一致的地址,可将字符串在'/'拆分,并将前后的字符串按字母重新排序, 即Junction_sorted(add)所示。而类似'Block of RHODEISLAND ST' → 'Block of RHODE ISLAND ST'的笔误,似乎没有什么一步到位的方法。fuzzywuzzy查找出所有可能的地址笔误生成字典(add_rect_map),通过映射加以修正。

def Junction_sorted(add): return " / ".join(sorted(add.split(' / '), key=str.lower)) #重新按字母顺序 排序
def Add_Rectify(add): return add_rect_map.get(add, add) #无匹配值时返回原值
data_raw['NewAddress'] = data_raw['Address'].apply(Junction_sorted)
data_raw['NewAddress'] = data_raw['NewAddress'].apply(Add_Rectify)

3. 纬度90°异常值修正。
  此类异常值共(67+76)条,所占比例极少,因此最简单当然是直接舍弃即可。参考文献中有采用与异常值条目的警局(PdDistrict)相同数据条经纬度坐标的均值(或中位值/最常见值)来替换的案例。更准确的方法其实可以考虑利用geocoder直接查询得到地址对应的经纬度坐标。


geocoder查询经纬度

如上图第1条结果所示,不限定城市和州的查询结果很有可能是错误的;对比第2/3条的结果可见,利用geocoder.arcgis查询时并不需要地址绝对正确也可以得到可信的结果。但尝试调用osm等其它地图查询会报错。google、bing等需要API key,其实直接用arcgis查询即可。
  3. 相同经纬度坐标但PdDisctrict、Address不一致的的数据条目。
  源数据集中存在相同的经纬度坐标下,数据条的警局辖区(PdDistrict)和地址不一致的情况。如下表所示,以第一行[-122.416294,37.777494]为例,该坐标下共1197条记录,其中的735条记录的PdDistrict字段为 NORTHERN,但该市10个警区中的5个都在该坐标点下的犯罪记录中出现过。其它出现不一致的数据条目的数据分布情况相对更为集中,如第二行的[-122.414744,37.778719]对应的2222条数据中的2199条,其警局显示为TENDERLOIN。换言之,利用最常见值替代不一致条目中的警区(PdDistrict)或地址(Address)是可信的。

相同坐标下的警区不一致示例

反向查询出该坐标对应的地址为‘1-7 9th St, San Francisco, California, 94103’后,通过Station Finder可查询对应的警区应为 TENDERLOIN

Station Finder查得的对应警局
  有理由怀疑,原数据集中的PdDisctrict字段,对应的更有可能是实施抓捕、亦或警局调度召唤前往执行任务警员的归属警区等,而并不一定真正对应社区所属的警局。因此或许并不能将该字段作为可信的犯罪预测的空间信息,尽管不一致的情况并不算严重。也或许PdDisctrict字段可能某种程度上可反应不同警局在定罪时的宽严尺度等,从这一点上说应该保留。将该字段加入训练模型对犯罪预测是否有帮助,也许只有等模型训练后才可能知道。
   Address地址字段的不一致情况在意料之中:不同精度经纬度坐标所对应的实际物理位置,有可能出现多个街区/建筑等。如与前述提及的[-122.416294,37.777494]坐标下的地址名称共12个不同的值,但实际上权属于'### Block of JOHNMUIR DR'、'### Block of JOHN MUIR DR'……也由此或许利用Postcode来作为地址更具一致性,后续模型选择特征时应加以考虑。当然,将上述不一致的数据条全部统一成出现各组中频率最多的地址也未尝不可。
   一个可以考虑的替代方案是利用geocoder查询出条目所在地址的邮编作为模型训练的特征,或许比采用地址字符串更有实际意义。

postcode = re.search(r'[0-9]+$',geocoder.arcgis(add + ', SF, California').address)[0]
或是
latlng= [np.round(cord,6) for cord in geocoder.arcgis(add + ',SF, California').latlng] #利用地址查经纬度
postcode = geocoder.osm(latlng, method='reverse').postal #利用经纬度得到邮编

此外,有研究指出:暴力犯罪、车辆盗窃等类似犯罪行为更多的发生在社区的边界,而入室盗窃等侵财类犯罪发生在社区内部更频繁。原数据集中接近30%的数据条其地址(Address)类似'OAK ST / LAGUNA ST',表明发生地点是在街角部位。提取地址字段的相关信息,构造标识犯罪地点为街道(社区)还是交界处的新字段,对于预测类型或许有帮助。


不同类型犯罪在街角/社区内部的记录数
Category kdeplot.jpg

预处理结果

经过上述修正后的数据条目如下所示(只列出了空间信息相关字段)


空间信息预处理结果
按警局统计犯罪记录

  当然,根据数据条目的地址实际上还可进一步的查询地址对应社区的收入/教育/居民种族等信息等,有研究在预测纽约市的犯罪发生几率时考虑了所在地点是否为游客集中的热门景区,作为预测偷窃类案件发生的特征。可资借鉴类似研究案例有许多,感兴趣的可进一步查阅。至此,对于San Francisco Crime Classification中的空间信息特征的预处理算基本完成。下一步考虑对时间相关信息的处理。


San Fransisco市相关统计信息示例
参考资料

Nagin D S, Paternoster R. Population Heterogeneity and State Dependence: State of the Evidence and Directions for Future Research[J]. Journal of Quantitative Criminology, 2000.
Bowers K J, Johnson S D, Pease K, et al. Prospective Hot-Spotting: The Future of Crime Mapping?[J]. British Journal of Criminology, 2004, 44(5): 641-658.
python3:小数位的四舍五入(用两种方法解决round 遇5不进)
Python Geocoder
FuzzyWuzzy:简单易用的字符串模糊匹配工具
A map of which SF neighborhoods became richer since 1990
San Francisco Climate & Health Program: Community Resiliency Indicator Maps

上一篇下一篇

猜你喜欢

热点阅读