通过 Python 入门数据科学(Data Science)

Linux Story

纯正开源之美 有趣、有料、有意思

比较老气的大一新生,很宅,很喜欢动手做东西。

进行科学数据分析,并不一定要用那些昂贵的工具,你也可以试试这些“能干”的开源工具。

不论你是有着数学或者计算机相关背景的爱好数据科学(Data Science)领域的萌新,或是一个不相关的领域专家,你都不可避免接触到数据科学。而你又不需要那些昂贵的、特专业的企业软件的话,那你可以选择这篇文章所介绍的开源工具!

Python,它的机器学习和数据科学库(pandas,Keras,TensorFlow,scikit-learn,SciPy,NumPy 等等),和它的扩展的可视化列表库(Matplotlib,pyplot,Plotly 等等)对于初学者和专家等来说都是出色的开源工具。简单易学、普及率高、有社区提供支持,并且内置了最新的库和数据科学所用到的算法,这些工具都能给刚开始学习的你带来很大的帮助。

很多 Python 库都继承自某一个基础库(就是我们所熟知的依赖关系),而在科学数据分析领域,最基础的便是 NumPy 这个库。它专为数据科学分析设计,NumPy 库经常用于储存数据集中的关系型数据部分,这部分数据储存在它的 ndarray 类型中。这种数据类型便于存储来自关系型数据表(如 csv 或其他格式的文件)中的数据,反之亦然。

当 scikit 库中的函数应用于多维数组的时候,其便利性就体现得更加明显。如果只是进行数据查询,那么 SQL 语言是很好的工具,但是对于复杂和资源密集型科学数据操作就显得蹩脚了,而把数据存储在 ndarray 中则可以提高效率和速度(但这种优势只在处理大量数据时才能显现出来)。

当你开始用 pandas 来进行知识抽取和分析的时候,pandas 中的 DataFrame 数据类型与 NumPy 中的 ndarray 之间的强强联合会形成用于知识抽取和计算密集型操作的有力工具。

为了快速说明问题,让我们打开 Python 的 shell ,然后加载一个关于犯罪分析的数据集,这个数据集使用 pandas 的 DateFrame 类型存储,让我们来初探这个被加载的数据集。

<table><tbody>

1

2

3

4

>>> import pandas as pd

>>> crime_stats = pd.read_csv('BPD_Arrests.csv')

>>> crime_stats.head

/<tbody>/<table>

现在,在这个 pandas 的 DataFrame 类型数据集中,我们可以运用 SQL 查询语句进行大多数查询。例如,得到所有“Description”属性的唯一值,SQL 查询是这样的:

<table><tbody>

1

2

$ SELECT unique(“Description”) from crime_stats;

/<tbody>/<table>

在 pandas 的 DataFrame 里面实现相应功能的语句是这样的:

<table><tbody>

1

2

3

4

5

6

>>> 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']

/<tbody>/<table>

这样的话就会返回一个 NumPy 数组(ndarray):

<table><tbody>

1

2

3

>>> type(crime_stats['Description'].unique)

<class>

/<tbody>/<table>

之后,我们来把数据传递给一个神经元网络模型,来看看它的预测到底有多准确。给它一个类似的数据如犯罪时间,犯罪类型,和它发生的相关种种,让它预测用了哪种类型的武器,代码如下:

<table><tbody>

1

2

3

4

5

6

7

8

9

10

11

>>> 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)

/<tbody>/<table>

现在,学习模型已经准备完毕,我们可以进行一些测试来估计它的预测质量和稳定性。让我们先从一些训练用的测试数据开始(这部分的原始数据是用来训练(train)模型的,而不是用于创建模型的):

<table><tbody>

1

2

3

>>> predict_weapon.predict(training_set_weapons)

array([4, 4, 4, ..., 0, 4, 4])

/<tbody>/<table>

如你所看到的那样,它会返回一个列表,每一个数据都是一个预测结果,表示一种武器,对应训练数据集(training set)中的一条记录。我们看到数字,而不是武器名,这是因为它和大多数分类算法一样,为分析大量数据而做出了优化。

对于数组数据,我们有多种方法将数字转换成能被我们直观理解的描述形式(如武器名)。在这个例子中,运用的技术是 LabelEncoding ,用的是 sklearn 中 preprocessing 库中的 LabelEncoder 函数:preprocessing.LableEncoder。它可以对数据进行相关的转换和逆转换。在这个例子中,我们用了 LabelEncoder 中的 inverse_transform 函数来看看武器 0 和 4 分别代表了什么:

<table><tbody>

1

2

3

>>> preprocessing.LabelEncoder.inverse_transform(encoded_weapons)

array(['HANDS', 'FIREARM', 'HANDS', ..., 'FIREARM', 'FIREARM', 'FIREARM']

/<tbody>/<table>

这些数据看起来很有意思,但是并没有得到这个模型的预测准确度是多少,我们来进行一些计算以得到其百分比:

<table><tbody>

1

2

3

>>> nn_model.score(X, y)

0.81999999999999995

/<tbody>/<table>

这些数据显示出了我们的神经网络模型有将近82%的精确性。这个结果似乎让人感觉不错,但是我们也不要忘了更换不同的数据集来测试他的有效性。这里列举了一些其他类型的测试,如:相互关系、模糊测试、矩阵测试等等。这些都可以用于测试模型的有效性。然而,虽然我们的模型具有很高的精确度,但是这对普通的犯罪数据集并不是很有用。就像我们用的这个数据集一样,这个数据集中使用“枪支”这一类武器的记录非常多,那么无论我们之后输入何种数据,预测结果都会更加偏向于使用“枪支”。

在我们分类之前清除数据、消除离群数据和畸变数据是很重要的。预处理越好,我们的精确度就越高。同样,通过给模型/分类器塞过量数据来提高精确度(高于90%)是很不理智的,因为这样非但不能达到目的,还会造成过度拟合。

如果你想用交互式图形界面代替命令行,那么 Jupyter notebooks 是一个很好的选择。虽然大多数的事情在命令行中都能处理得很好,但当你开始用 snippets 来生成可视化时,就能体会到 Jupyter 给你带来的好处。它可以把数据整理的比终端还好。

这里(https://machinelearningmastery.com/best-machine-learning-resources-for-getting-started/)不仅给大家列出了一些很不错的机器学习的免费资源,还提供了很多其他指导和教程。由于兴趣爱好的不同,你会发现网上有很多可用的开源数据集。但是在刚开始学的时候,Kaggle (https://www.kaggle.com)维护的数据集,和那些政府网站提供的数据集是很好的资源。

本文由 纷寂 翻译。更多详情请访问原文链接。

原文链接:https://opensource.com/article/18/3/getting-started-data-science

本文链接:https://linuxstory.org/getting-started-data-science/