Python演练:用机器学习将车祸“扼杀”在摇篮里!
惠灵顿车辆相撞
道路交通事故是我们全世界社会的一个主要问题。据世界卫生组织(WHO)估计,2010年有125万人死于道路交通伤。2016年,仅美国就有37 461起与机动车相关的死亡事件,平均每天约102人。在欧洲,统计数据还表明,2017年每分钟有50人死亡。那么,机器学习能否帮助我们了解影响车祸严重程度的原因和因素?
在本文中,我们将完成一个完整的机器学习管道,从通过api获取数据、执行探索性数据分析,到将一个实际问题构造成机器学习模型。这个Github Gist提供完整的代码和Jupyter笔记本。整个过程在Google Colab中使用他们的免费GPU / TPU环境进行,因此您可以直接从Github打开笔记本并在Google Colab中进行实验。
获取数据
崩溃分析系统(CAS)数据以不同的格式和API提供。通过API接口获取它们很简单,而不是下载到本地计算机。这是有益的,因为我们每次运行Jupyter笔记本时都会访问最新的更新数据。我发现这个特殊的问题,即车辆事故,与位置(地理位置)密切相关,因此我们将获取Geojson文件,而不是通常的CSV文件,这样我们就可以执行地理数据分析而无需从纬度和经度创建几何图形并处理坐标参考系统和预测。
我们将使用Geopandas库来读取数据。如果您熟悉Pandas库,那么您应该感到宾至如归,因为Geopandas建立在顶级Pandas上。 Geopandas是一个高级库,可以更轻松地处理Python中的地理数据,因为它允许pandas功能和数据类型允许对地理几何进行空间操作。它与Python生态系统很好地集成在一起,在几何操作方面非常依赖panda、Matplotlib和shapely库。
# Get the data from url and request it as json file url = 'https://opendata.arcgis.com/datasets/a163c5addf2c4b7f9079f08751bd2e1a_0.geojson' geojson = requests.get(url).json() # Read the data as GeodataFrame in Geopandas crs = {'init': 'epsg:3851'} # Coordinate reference system (CRS) for Newzealand gdf = gpd.GeoDataFrame.from_features(geojson['features'], crs=crs)
探索性数据分析
在新西兰,自2000年以来,直至2018年的碰撞事故总死亡人数为6922人。而车祸中重伤和轻伤的总人数分别为45044人、205895人。虽然这个数据集记录了向新西兰警方报告的所有坠机事件,但我们必须考虑所有坠机事件都没有向新西兰警方报告,特别是非致命事故。大多数撞车都是非伤害性撞车,而致命撞车事故最少。就死亡率而言,大多数崩溃的死亡率为0。
左 - 碰撞严重类别。右 - 车祸死亡人数
多年来,总体统计显示坠机严重程度和死亡人数下降,但从线图中可以看出,从2016年开始,死亡人数似乎有所增加。另一方面,2017年出现了严重伤害和轻伤的高峰。
从2000年到2018年的坠机事故
道路和其他相关属性也表明车祸的严重程度以及死亡率水平。那么让我们探讨它们之间的关系。就死亡人数和道路上的车道数量而言,2车道似乎比其他任何车道都要高。直道似乎与死亡人数的关系较小,而大多数死亡事故与某种道路弯曲有关(容易、中等和严重)。
右:道路曲率和坠机死亡率。左:车道数和死亡率
让我们看一下交通法规及其与车祸严重程度和死亡率的关系。速度限制是探索这种关系的一个好方法。 90公里/小时是最致命的限速,其次是100公里。
速度限制和死亡事故计数
探索天气也表明,雾和强风在死亡率方面的比例最高。雨、雪和霜冻的比例也很高。
天气对坠机事故造成的影响
地理数据探索
地理数据可视化清楚地表明了冲突发生的地方。正如您可能预期的那样,大多数车祸发生在道路上,而且主要发生在城市。
所有车辆坠毁点
让我们来看看在奥克兰的车祸。
新西兰奥克兰的一些坠机点
机器学习
我们可以用不同的方式处理这个问题的建模部分。我们可以将其作为回归问题,并根据数据集的属性预测死亡人数。我们还可以将其作为分类问题进行处理,并根据数据集预测崩溃的严重性。在这个例子中,我将它作为回归问题来处理。如果您想尝试一下,请随意构建分类模型。它基本上是相同的方法。在这种情况下,我不会进行任何特征工程,我认为我们拥有的属性足以构建基线,我们可以随时重新考虑这一点并稍后进行特征工程以提高模型的准确性。
我们首先需要将分类特征转换为数值,可以使用Sklearn库来做到这一点:
# Label encoder from sklearn.preprocessing import LabelEncoder lblE = LabelEncoder() for i in df: if df[i].dtype == 'object': lblE.fit(df[i]) df[i] = lblE.transform(df[i])
然后我们将数据分成依赖和独立变量以及训练和验证集,以便稍后评估我们的模型结果。
# Let us split our data into training and validation sets X_train, X_test, y_train, y_test = train_test_split(df.drop('fatalCount', axis=1), df.fatalCount, test_size=0.33, random_state=42)
现在我们准备将机器学习模型应用于我们的数据。通常从随机森林开始,这是一种基于树的算法,在许多数据集上表现良好。
m = RandomForestRegressor(n_estimators=50) m.fit(X_train, y_train) print_score(m) Output: RMSE Train:0.017368616661096157, RMSE Valid:0.042981327685985046, Accuracy Train: 0.977901052706869, Accuracy Valid: 0.8636075084646185
正如您所能,简单的随机森林模型在验证集上给出了86%的准确度,经过一些初步的微调和使用特征重要性选择后,模型可以提升到87%。我们可以进一步改进模型,创建新功能或使用其他算法来提高模型性能。但是现在,这对于本文来说已经足够了。这是我们的随机森林模型中最重要的一些特性。
功能重要性
结论
我希望你喜欢阅读这篇文章。如果您想尝试和试验代码,可以使用GitHub Gist,您可以直接在Google Colab中打开Notebook。
来源:https://towardsdatascience.com/predicting-vehicle-accidents-with-machine-learning-ce956467fa74
编译出品