道路交通事故是全球社会面临的一个重要问题。据世界卫生组织(WHO)估计,2010年全球因交通事故丧生的人数达到了125万。而在美国,2016年有超过37,000人因机动车事故丧生,平均每天约有102人。在欧洲,2017年的统计数据也显示,平均每分钟有50人因交通事故丧生。那么,机器学习是否能帮助我们更好地理解导致车祸严重程度的因素?
在本文中,我们将构建一个完整的机器学习流程,包括通过API获取数据、进行探索性数据分析,再到将实际问题转化为机器学习模型。所有代码和Jupyter笔记本可以在GitHub Gist上找到,并且整个过程在Google Colab中运行,用户可以直接从GitHub打开笔记本并在Google Colab中进行实验。
碰撞分析系统(CAS)的数据可以通过API以多种格式提供。我们通过API接口获取数据,而不是下载到本地计算机,这使得我们每次运行Jupyter笔记本时都能获得最新的数据更新。我注意到车辆事故与地理位置密切相关,因此我们将获取Geojson文件,而不是常见的CSV文件,以便进行地理数据分析,而不需要从经纬度创建几何图形并处理坐标参考系统和预测。
我们将使用Geopandas库来读取数据。如果您熟悉Pandas库,您会发现Geopandas非常友好,因为它建立在Pandas之上,提供了更便捷的地理数据分析功能。Geopandas与Python生态系统完美集成,并依赖于Pandas、Matplotlib和Shapely库来进行几何操作。
```python import requests import geopandas as gpd
url = 'https://opendata.arcgis.com/datasets/a163c5addf2c4b7f9079f08751bd2e1a_0.geojson' geojson = requests.get(url).json()
crs = {'init': 'epsg:3851'} gdf = gpd.GeoDataFrame.from_features(geojson['features'], crs=crs) ```
在新西兰,从2000年至2018年,共有6922人因交通事故死亡,其中重伤人数为45044人,重伤人数为205895人。尽管数据集记录了向新西兰警方报告的所有事故,但我们必须意识到并非所有事故都向警方报告,特别是非致命事故。大多数事故是非损伤性的,而致命事故则较少。在死亡率方面,大多数事故的死亡率为零。
通过统计分析,我们可以看出从2000年到2018年,事故的严重程度和死亡人数呈现下降趋势,但从2016年开始,死亡人数似乎有所增加。另一方面,2017年出现了轻伤和重伤的高峰。
此外,道路和其他相关属性也表明事故的严重程度及死亡率。例如,两条车道的道路比其他车道更容易发生事故。直线道路与死亡率的关系较小,而大多数死亡事故与某种道路弯曲有关(容易、中等和严重)。
地理数据分析显示,大多数事故发生在道路上,特别是在城市地区。例如,在奥克兰市,我们可以看到一些事故的发生地点。
我们可以采用不同的方法来处理这个数据建模的问题。一种方法是将其作为回归问题,根据数据集的属性预测死亡人数。另一种方法是将其作为分类问题,根据数据集预测事故的严重程度。在这个案例中,我们将其作为回归问题来处理。如果您想尝试分类模型,可以使用相同的方法。
首先,我们需要将分类特征转换为数值特征,可以使用Scikit-Learn库来实现:
```python from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder() for column in df.columns: if df[column].dtype == 'object': labelencoder.fit(df[column]) df[column] = label_encoder.transform(df[column])
from sklearn.modelselection import traintest_split
Xtrain, Xtest, ytrain, ytest = traintestsplit( df.drop('fatalCount', axis=1), df['fatalCount'], testsize=0.33, randomstate=42 )
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(nestimators=50) model.fit(Xtrain, y_train)
from sklearn.metrics import meansquarederror, r2_score
trainrmse = meansquarederror(ytrain, model.predict(Xtrain), squared=False) validrmse = meansquarederror(ytest, model.predict(Xtest), squared=False) trainr2 = r2score(ytrain, model.predict(Xtrain)) validr2 = r2score(ytest, model.predict(Xtest))
print(f"RMSE Train: {trainrmse}, RMSE Valid: {validrmse}") print(f"Accuracy Train: {trainr2 * 100:.2f}%, Accuracy Valid: {validr2 * 100:.2f}%") ```
通过简单的随机森林模型,我们得到了大约86%的验证准确率。通过一些初步的调优和特征选择,模型的准确率可以提升到87%。当然,我们还可以进一步优化模型,比如通过创建新特征或使用其他算法。
希望您喜欢这篇关于使用机器学习预测车辆事故的文章。如果您想尝试和实验代码,可以访问GitHub Gist上的链接,并直接在Google Colab中打开笔记本。
来源:https://towardsdatascience.com/predicting-vehicle-accidents-with-machine-learning-ce956467fa74