数据科学Python——从零开始

在本文中,我们将研究数据可视化以及它如何揭示数据最深刻和最黑暗的秘密。接下来,我们将构建我们的第一个机器学习模型,以便了解到底它到底是什么!

I.数据可视化

在数据科学中,如果您有1000行数据和大量的列。想象一下,如果您必须浏览每条记录并了解它在该数据集中的重要性,那将是多么可怕的。但是,如果您将数据可视化或绘制成最适合的图表,则可以在一秒钟内获得每个数据点的重要性。

Matplotlib

Matplotlib是一个可用于python平台的数据可视化库。它以柱状图,直方图,箱形图和其他几个基本图表的形式提供2D表示。我们还有许多其他更好的库,如Plotly,Bokeh,为您提供诱人的表现形式。但要理解matplotlib中的基础知识,然后才能逐渐掌握其他的。

1、折线图:

我认为可视化实际数据比虚拟数据更有意义。为此,我使用了Kaggle 的Crime in India数据集。折线图是2D表示,显示了一个变量相对于另一个变量的趋势。

数据科学Python——从零开始

折线图

 import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
data = pd.read_csv('datasets/10_Property_stolen_and_recovered.csv')
#Extract the delhi row and pivot it based on Year and Cases of Property stolen
line = data[data['Area_Name']=='Delhi'].pivot_table(index='Year',values='Cases_Property_Stolen')
#plot the line variable
plt.plot(line)
plt.xlabel('Year')
plt.ylabel('Number of Property Stolen Cases in Delhi')
plt.show()
数据科学Python——从零开始

Matplotlib.pyplot库存储看起来像Matlab的方法。在matplotlib.pyplot中,关于绘图图形(这里是plt)和绘图区域保留了某些状态。任何可能使用的进一步方法都假定是针对这个特定的图本身的。

  • plt.plot()函数的作用是绘制X-Y轴上的点。
  • 给出了x轴和y轴标签。
  • 最后,我们使用show()函数在控制台上显示图表并将命令返回给IPython shell。

2、柱状图

数据科学Python——从零开始

柱状图

柱状图柱状图用于显示分类变量的频次或度量。

#produce a dataframe where in rows only Dacoity exits
x = data[data.loc[:,'Sub_Group_Name']=='1. Dacoity']
# make a pivot_table where names of States are mentioned alongside the total number of propert stolen cases
bar = x.pivot_table(index='Area_Name',values='Cases_Property_Stolen',aggfunc=np.sum)
#select random set of index
index=bar[5:10].index
#enlarge the figure size
plt.figure(figsize=(9,5))
#plot the bar chart
plt.bar(index,bar.Cases_Property_Stolen[5:10],width=0.5)
#set xlabels and ylabels
plt.ylabel('Number of property stolen')
plt.xlabel('States in India')
#set the title
plt.title('Dacoity from 2001- 2010')
plt.show()
数据科学Python——从零开始

在matplotlib.pyplot中,我们使用bar()方法来构建图表。bar方法需要两个必需参数,一个是x轴标签,另一个是这些标签的高度。

3、饼状图:

数据科学Python——从零开始

数据科学Python——从零开始

饼状图

饼状图上面的柱状图很棒,但我们无法弄清楚记录的案件中有多少比例属于哪个地方。就此而言,为了清楚地了解我们构建饼状图的每个地区的百分比。

plt.figure(figsize=(6,6))
#pie() method
plt.pie(bar.Cases_Property_Stolen[5:10],labels=index,autopct='%1.1f%%',shadow=True, startangle=90)
#equal axis ensures that we get a perfect circle
plt.axis('equal')
plt.title("DACOITY CASES RECORDED(2000 - 2010)")
plt.show()
数据科学Python——从零开始

这里,pie()方法必须需要两个参数,一个是标签,第二个是将分配给该特定标签的大小或角度。autopct属性用于为饼状图的扇形提供标签。

4、散点图:

数据科学Python——从零开始

散点图

散点图散点图用于检查变量的分布或变量之间的关系。因此,我们需要在x轴和y轴上绘制至少2个字段。我使用了一个随机数生成器,它只是分配一种颜色。

plt.figure(figsize=(16,9))
#depict random colors
colors = np.random.rand(35)
#prepare a pivot table for representations
scatter = data.pivot_table(index='Area_Name',values=['Cases_Property_Stolen','Value_of_Property_Stolen','Value_of_Property_Recovered'],aggfunc=np.sum)
#plot the scatterpoints
plt.scatter(scatter.Cases_Property_Stolen,scatter.Value_of_Property_Stolen,c=colors)
plt.xlabel('Number of Property Stolen cases')
plt.ylabel('Value of Property Stolen')
plt.show()
数据科学Python——从零开始

5、直方图:

直方图是查看变量分布的好方法。bin或bucket的概念非常重要,是直方图。bin大小定义了数据进入“bin”的程度。比如bin大小是10,所以表示将是0-10,10-20,20-30,依此类推。现在假设bin大小为50,表示为0-50,50-100等。

数据科学Python——从零开始

直方图

直方图我们可以解释大多数案件是抢劫少于约2000件物品。

plt.figure(figsize=(16,9))
#draw a hist with say 35 bins
plt.hist(data.Cases_Property_Stolen,bins=35)
#provide labels
plt.xlabel("Bins bases on quantity of property stealth")
plt.ylabel("Count")
plt.axis([0,50000,0,3000])
plt.show()
数据科学Python——从零开始

6、箱形图:

Boxplot用于绘制变量的分布并检测其异常值。所有异常值都以圆圈表示。虽然矩形框表示数据的最大集中位置,但它还指出了最小值,最大值和四分位数间距以及一条实际上是中值的线。

数据科学Python——从零开始

箱型图

箱形图该箱型图表示数据严重偏斜,同时存在多个异常值。这正是直方图所传达的,但是以不同的表示形式。在这里,我们清楚地了解了异常值及其数量,但直方图中的图像并不一样。

plt.figure(figsize=(16,9))
plt.boxplot(data.Cases_Property_Recovered)
plt.ylabel("Count")
plt.show()

据我所知,箱型图和直方图都可以用来考虑变量的分布。这取决于你决定选择哪一个!

现在,了解这些少数图表就足够了。

II、机器学习:

我们已经获得了关于python的原始知识以及我们如何使它为我们工作。

什么是机器学习?

让我们回到20世纪50年代,你是一个受欢迎和有才华的演员的私人助理。现在这位著名的名人收到了成千上万封来信,来自他的粉丝、崇拜者、导演、制片人、广告公司、演员伙伴等等。现在名人忙着做他的工作,而你的工作是在午餐时间给他带来所有重要和紧急的信件。所以你整个上午都在浏览和阅读一堆信件,把不重要的信息给那位大人物过滤掉。就在那时你叹了口气说:“我希望我有一根魔杖可以自己把这些信息给分类出来”。

快进60年,那魔杖就是今天的机器学习。虽然建立一个机器学习模型并不像转动魔杖那么容易,但如果做得好,结果确实是神奇的!

回到技术性,机器学习是自动处理大量数据,从数据中学习并从中产生有价值的东西。

考虑一个电子邮件垃圾邮件过滤程序,它可以阻止包含“购物”一词的所有电子邮件。我们开发了一种机器学习算法,可以将这些信息直接扔进垃圾箱。但是,我也可以写一个简单的IF-THEN语句并完成我的工作。为什么要炫耀机器学习?

机器学习正在使一个系统或机器像人类一样思考,这样人类就不必浪费时间从其收件箱中过滤出愚蠢的垃圾邮件。

在现实生活中,数据从未如此分类和精确。每组新数据都存在惊人的变异程度。我们人类有智慧将相关与不相关的东西分开。我们试图将这种智能复制到机器学习模型中。机器学习模型逐渐发展并尝试从他们获得的每种新数据模式中学习。

机器学习的类型:

1、监督学习 -简单地说它是在和老师学习。

你的老师教一朵花的结构; 什么是花冠,什么是花萼、花瓣等。你学习并编写测试。老师检查答案并告诉你你的表现如何。她监督着你。同样,在监督学习中,我们已经知道给定输入变量集的结果变量是什么。我们必须在输入数据上训练模型,以便产生所需的目标。该模型不断学习和适应,直到达到近乎完美的结果。

2、无监督学习:没有老师的学习。

您是否注意到“您可能也喜欢......”部分?这是无监督学习的一个有力例子。这里的学习没有老师,它被用来挖掘隐藏在黄金数据矿中的黄金。因此,当您从网上购买白板时,它会运行一个模型,该模型会自动将所有其他相关对象(如笔,板擦和其他)聚集到一起为你推荐。如果购买对象也发生变化,这些建议会迅速改变,对吧?看,模型还不知道推荐是洗碗机还是空调,它只是学习并提供结果。

3、Scikit-learn

Scikit-learn是一个开源库,包含几种方法,可以让我们对给定的数据上进行机器学习。它依赖于SciPy和NumPy库,所以在开始使用之前要加载所需要的库。虽然在安装Anaconda时安装了sklearn,但如果您遇到任何问题,可以在Python中直接使用

pip install sklearn

我们将研究iris数据集,以获得更多关于scikit-learn的实践经验。我保证,在我们学习的过程中,你会学到所有必要的术语以及它们的含义。

想象一下,有一位充满激情的植物学家,她喜欢收集鸢尾花。因此,她每天早晨都会进入野外,在她漫步时,她会收集所有可能的鸢尾花。然后,当她回到家时,她测量花瓣的长度和宽度,以及萼片的长度和宽度。基于这四种长度,她将收集的花朵区分为三种:Setosa,Versicolor或Virginica。这意味着给定一组输入测量值,我们的植物学家就可以确定它可能属于哪种物种。让我们假设只有这三个类在野外可用。

我们的任务是建立一个机器学习模型,可以根据测量结果正确地告诉我们花的种类。由于我们已经知道输出将是三类鸢尾花之一,这是一个监督学习问题。此外,它是一个分类问题,因为您看到我们正在将给定的花分类为预定义的类(种类)。更准确地说,这是一个三级分类问题。让我们满足数据:

1、导入所有必要的库,如下所示:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

2、导入鸢尾花数据集:由于数据集本身不提供列标题,我们首先将列标签放在名为columns的列表中,然后使用read_csv函数加载数据集以及刚刚声明的列。

columns=['sepal length in cm', 'sepal width in cm','petal length in cm','petal width in cm' ,'class']
data = pd.read_csv("datasets/iris.data",names=columns)
数据科学Python——从零开始

3、了解数据:

好的,我们已经将数据集声明为花瓣和萼片以及目标类的测量值。但对于外行人来说,花瓣和萼片是什么?

数据科学Python——从零开始

IRIS类萼片是保护花蕾并保持花瓣位置的叶子。花瓣,正如我们大多数人所知,是修饰的叶子,形成一朵花,围绕着它的繁殖部分。至于鸢尾花,这些长度决定了它们所属的种类。

data.shape

(150,5)

shape()方法输出数据集中的行数和列数。这里(x,y)其中x是行数,y是列数。

data.describe()
数据科学Python——从零开始

describe()函数告诉我们数值变量的摘要。在这里我们可以看到每列的数量是150,即。没有空值。然后我们得到每列的mean,std,min,max……。

4、数据可视化:最后我们使用我们之前学到的东西!

4.1、单变量分析可以更好地理解每个变量。在这里,我们创建了所有测量的箱型图。

#create a subplot grid of 2x2 plots with the given size 
fig, ax = plt.subplots(2,2,figsize=(10,8))
ax[0,0].boxplot(data['sepal length in cm'])
ax[0,0].set_title("Sepal length")
ax[0,1].boxplot(data['sepal width in cm'])
ax[0,1].set_title("Sepal width")
ax[1,0].boxplot(data['petal length in cm'])
ax[1,0].set_title("Petal length")
ax[1,1].boxplot(data['petal width in cm'])
ax[1,1].set_title("Petal width")
fig.subplots_adjust(left=0.08, right=0.98, bottom=0.05, top=0.9,
hspace=0.3, wspace=0.2)
plt.show()
数据科学Python——从零开始

  • 箱形图我们可以看到萼片长度范围从4到8.0单位,没有异常值
  • 虽然萼片确实有一些异常值,准确的说是三个异常值。
  • 花瓣长度和宽度没有异常值。

4.2、多变量分析检查变量之间的关系。我们使用seaborn包来查看此分析。Seaborn是另一个极好的绘图包,实际上是基于matplotlib。

import seaborn as sns
sns.set()

pairplot()方法绘制所有给定的4个测量值并尝试建立它们之间的关系。每次测量都与其他测量结果进行比较。

数据科学Python——从零开始

配对图从给定的图表中,我们可以清楚地看到每朵花的测量值集中在特定的数字范围内。因此,我们可以成功运行分类算法并获得所需的鸢尾花种类。

5、拆分数据:

在开始针对这些参数构建机器学习模型之前,我们需要一些确认,即我们作为花的“类”生成的任何输出都是正确的。但从逻辑上讲,我们不能使用我们用于训练模型的相同数据来测试模型。我们需要看不见的新数据,这些数据实际上具有预测的输出类变量。我们将在这些新数据上运行我们的模型并获得结果类。

为此,机器学习中的一般规则是在75%的数据上训练任何模型,称之为训练数据或训练集。其余25%的数据是测试数据或测试集

from sklearn.model_selection import train_test_split
arr = data.values
X = arr[:,0:4]
y = arr[:,-1]
X_train,X_test,y_train,y_test = train_test_split(X,y, random_state=0)

Python提供了一个内置函数来处理拆分,输入采用两个重要参数,即输入X列和输出y变量。默认的test_size是0.25,即整个数据的25%是测试数据,我们使用random_state = 0使我们能够混淆数据,然后随机选择分割。假设如果我们将最后25%的数据作为测试数据,我们将只有iris-virginica输出。这对于训练来说是极具误导性的,因此随机拆分。

Ps:使用大写X表示输入变量,小写y表示结果变量,这只是一种习惯。

6、构建模型:

现在我们转到最后也是最有趣的一步,即构建机器学习模型来学习这些。

对于此数据集,我们将使用KNN分类模型。

KNN算法: KNN代表K-nearest neighbors(K-最近邻居)。你是否曾经听说过这样一种信念:你的大部分时间都花在和其他人在一起,而你只是他们中的一个!应用此类比来理解KNN算法。KNN考虑给定数据点的邻居,并根据这些邻居属于哪个类,确定给定数据点的类。这个算法中的'K'是我们为分析考虑的邻居数,比如k = 3告诉使用3个邻居。

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)
数据科学Python——从零开始

  • KNN算法属于名为KNeighborsClassifier的sklearn.neighbors包中。
  • 要使用此算法,我们需要从给定的类中实例化一个对象。我们称这个对象为'knn'。为简单起见,我们只使用一个邻居进行训练。不要担心我们将在稍后的工作。
  • 使用fit()方法,我们在训练集上训练模型。fit()方法有两个参数,一个是包含所有测量值的X_train,第二个参数是包含这些测量值的所有标签的y_train。

但是训练模型是不够的,我们需要测试它!

pred = knn.predict(X_test)
print("The model has a accuracy of "+str((knn.score(X_test,y_test)*100)))

The model has a accuracy of 97.36842105263158

使用测试向量X_test,我们在其上部署训练有素的knn模型。score()方法计算给定测试数据的平均准确度。它采用测试数据点及其测试数据标签并输出准确度。对于我们的模型,我们得到了高达97%的精度。您部署了第一个机器学习模型。


分享到:


相關文章: