无论您是拥有数学或计算机科学背景的初露头角的数据科学爱好者,还是不相关领域的专家,数据科学提供的可能性都触手可及。而且您不需要昂贵的、高度专业化的企业软件——本文讨论的开源工具是您入门所需的一切。
Python 及其机器学习和数据科学库(pandas、Keras、TensorFlow、scikit-learn、SciPy、NumPy 等)及其广泛的可视化库(Matplotlib、pyplot、Plotly 等)是初学者和专家都适用的优秀 FOSS 工具。Python 易于学习,足够流行以提供社区支持,并配备了为数据科学开发的最新新兴技术和算法,这些构成了您入门时可以获得的最佳工具集之一。
许多 Python 库都彼此构建(称为依赖项),而基础是 NumPy 库。NumPy 专为数据科学而设计,通常用于在其 ndarray 数据类型中存储数据集的相关部分,这是一种方便的数据类型,用于存储来自关系表的数据记录,如 csv
文件或任何其他格式,反之亦然。当 scikit 函数应用于多维数组时,它尤其方便。SQL 非常适合查询数据库,但要执行复杂且资源密集型的数据科学操作,将数据存储在 ndarray 中可以提高效率和速度(但处理大型数据集时,请确保您有充足的 RAM)。当您开始使用 pandas 进行知识提取和分析时,pandas 中的 DataFrame 数据类型与 NumPy 中的 ndarray 之间的几乎无缝转换为提取和计算密集型操作创建了强大的组合。
为了快速演示,让我们启动 Python shell 并将来自巴尔的摩市的犯罪统计开放数据集加载到 pandas DataFrame 变量中,并查看加载的帧的一部分
>>> import pandas as pd
>>> crime_stats = pd.read_csv('BPD_Arrests.csv')
>>> crime_stats.head()

现在,我们可以在此 pandas DataFrame 上执行大多数可以在数据库中使用 SQL 执行的查询。例如,要获取“Description”属性的所有唯一值,SQL 查询是
$ SELECT unique(“Description”) from crime_stats;
为 pandas DataFrame 编写的相同查询如下所示
>>> crime_stats['Description'].unique()
['COMMON ASSAULT' 'LARCENY' 'ROBBERY - STREET' 'AGG. ASSAULT'
'LARCENY FROM AUTO' 'HOMICIDE' 'BURGLARY' 'AUTO THEFT'
'ROBBERY - RESIDENCE' 'ROBBERY - COMMERCIAL' 'ROBBERY - CARJACKING'
'ASSAULT BY THREAT' 'SHOOTING' 'RAPE' 'ARSON']
它返回一个 NumPy 数组 (ndarray)
>>> type(crime_stats['Description'].unique())
<class 'numpy.ndarray'>
接下来,让我们将此数据馈送到神经网络,以查看它在给定犯罪发生时间、犯罪类型和犯罪发生地点的社区等数据的情况下,预测所用武器类型的准确程度
>>> from sklearn.neural_network import MLPClassifier
>>> import numpy as np
>>>
>>> prediction = crime_stats[[‘Weapon’]]
>>> predictors = crime_stats['CrimeTime', ‘CrimeCode’, ‘Neighborhood’]
>>>
>>> nn_model = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5,
2), random_state=1)
>>>
>>>predict_weapon = nn_model.fit(prediction, predictors)
现在学习模型已准备就绪,我们可以执行多项测试来确定其质量和可靠性。首先,让我们输入训练集数据(用于训练模型且未包含在创建模型中的原始数据集部分)
>>> predict_weapon.predict(training_set_weapons)
array([4, 4, 4, ..., 0, 4, 4])
如您所见,它返回一个列表,每个数字预测训练集中每个记录的武器。我们看到的是数字而不是武器名称,因为大多数分类算法都针对数值数据进行了优化。对于分类数据,有一些技术可以可靠地将属性转换为数值表示。在本例中,使用的技术是标签编码,使用 sklearn 预处理库中的 LabelEncoder 函数:preprocessing.LabelEncoder()
。它具有转换和逆变换数据及其数值表示的函数。在本例中,我们可以使用 LabelEncoder() 的 inverse_transform
函数来查看武器 0 和 4 是什么
>>> preprocessing.LabelEncoder().inverse_transform(encoded_weapons)
array(['HANDS', 'FIREARM', 'HANDS', ..., 'FIREARM', 'FIREARM', 'FIREARM']
看到这个很有趣,但为了了解这个模型的准确性,让我们计算几个以百分比表示的分数
>>> nn_model.score(X, y)
0.81999999999999995
这表明我们的神经网络模型大约有 82% 的准确率。这个结果看起来令人印象深刻,但重要的是检查它在用于不同的犯罪数据集时的有效性。还有其他测试,如相关性、混淆矩阵等来完成此操作。虽然我们的模型具有很高的准确率,但它对于一般犯罪数据集来说不是很有用,因为这个特定数据集有不成比例的行将“FIREARM”列为使用的武器。除非重新训练,否则我们的分类器很可能预测“FIREARM”,即使输入数据集具有不同的分布。
重要的是在对数据进行分类之前清理数据并删除异常值和偏差。预处理越好,我们洞察的准确性就越高。此外,向模型/分类器提供过多数据以获得更高的准确率(通常超过约 90%)是一个坏主意,因为它看起来很准确,但由于过拟合而没有用处。
Jupyter notebooks 是命令行的一个很好的交互式替代方案。虽然 CLI 对于大多数事情来说都很好,但当您想随时运行代码片段以生成可视化效果时,Jupyter 会大放异彩。它还比终端更好地格式化数据。
本文列出了一些入门机器学习的最佳免费资源,但还有大量额外的指导和教程可用。您还将根据您的兴趣和爱好找到许多可用的开放数据集。作为起点,Kaggle 维护的数据集以及州政府网站上提供的数据集都是优秀的资源。
Payal Singh 将于今年 3 月 8-11 日在加利福尼亚州帕萨迪纳举行的 SCaLE16x 大会上发表演讲。要参加并获得 50% 的门票折扣,请使用促销代码 OSDC 注册
2 条评论