数据科学Python——从零开始
在本文中,我们将研究数据可视化以及它如何揭示数据最深刻和最黑暗的秘密。接下来,我们将构建我们的第一个机器学习模型,以便了解到底它到底是什么!
I.数据可视化
在数据科学中,如果您有1000行数据和大量的列。想象一下,如果您必须浏览每条记录并了解它在该数据集中的重要性,那将是多么可怕的。但是,如果您将数据可视化或绘制成最适合的图表,则可以在一秒钟内获得每个数据点的重要性。
Matplotlib
Matplotlib是一个可用于python平台的数据可视化库。它以柱状图,直方图,箱形图和其他几个基本图表的形式提供2D表示。我们还有许多其他更好的库,如Plotly,Bokeh,为您提供诱人的表现形式。但要理解matplotlib中的基础知识,然后才能逐渐掌握其他的。
1、折线图:
我认为可视化实际数据比虚拟数据更有意义。为此,我使用了Kaggle 的Crime in India数据集。折线图是2D表示,显示了一个变量相对于另一个变量的趋势。
折线图
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()
Matplotlib.pyplot库存储看起来像Matlab的方法。在matplotlib.pyplot中,关于绘图图形(这里是plt)和绘图区域保留了某些状态。任何可能使用的进一步方法都假定是针对这个特定的图本身的。
- plt.plot()函数的作用是绘制X-Y轴上的点。
- 给出了x轴和y轴标签。
- 最后,我们使用show()函数在控制台上显示图表并将命令返回给IPython shell。
2、柱状图
柱状图
柱状图柱状图用于显示分类变量的频次或度量。
#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()
在matplotlib.pyplot中,我们使用bar()方法来构建图表。bar方法需要两个必需参数,一个是x轴标签,另一个是这些标签的高度。
3、饼状图:
饼状图
饼状图上面的柱状图很棒,但我们无法弄清楚记录的案件中有多少比例属于哪个地方。就此而言,为了清楚地了解我们构建饼状图的每个地区的百分比。
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()
这里,pie()方法必须需要两个参数,一个是标签,第二个是将分配给该特定标签的大小或角度。autopct属性用于为饼状图的扇形提供标签。
4、散点图:
散点图
散点图散点图用于检查变量的分布或变量之间的关系。因此,我们需要在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()
5、直方图:
直方图是查看变量分布的好方法。bin或bucket的概念非常重要,是直方图。bin大小定义了数据进入“bin”的程度。比如bin大小是10,所以表示将是0-10,10-20,20-30,依此类推。现在假设bin大小为50,表示为0-50,50-100等。
直方图
直方图我们可以解释大多数案件是抢劫少于约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()
6、箱形图:
Boxplot用于绘制变量的分布并检测其异常值。所有异常值都以圆圈表示。虽然矩形框表示数据的最大集中位置,但它还指出了最小值,最大值和四分位数间距以及一条实际上是中值的线。
箱型图
箱形图该箱型图表示数据严重偏斜,同时存在多个异常值。这正是直方图所传达的,但是以不同的表示形式。在这里,我们清楚地了解了异常值及其数量,但直方图中的图像并不一样。
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)
3、了解数据:
好的,我们已经将数据集声明为花瓣和萼片以及目标类的测量值。但对于外行人来说,花瓣和萼片是什么?
IRIS类萼片是保护花蕾并保持花瓣位置的叶子。花瓣,正如我们大多数人所知,是修饰的叶子,形成一朵花,围绕着它的繁殖部分。至于鸢尾花,这些长度决定了它们所属的种类。
data.shape
(150,5)
shape()方法输出数据集中的行数和列数。这里(x,y)其中x是行数,y是列数。
data.describe()
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()
- 箱形图我们可以看到萼片长度范围从4到8.0单位,没有异常值
- 虽然萼片确实有一些异常值,准确的说是三个异常值。
- 花瓣长度和宽度没有异常值。
4.2、多变量分析检查变量之间的关系。我们使用seaborn包来查看此分析。Seaborn是另一个极好的绘图包,实际上是基于matplotlib。
import seaborn as sns sns.set()
pairplot()方法绘制所有给定的4个测量值并尝试建立它们之间的关系。每次测量都与其他测量结果进行比较。
配对图从给定的图表中,我们可以清楚地看到每朵花的测量值集中在特定的数字范围内。因此,我们可以成功运行分类算法并获得所需的鸢尾花种类。
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)
- 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%的精度。您部署了第一个机器学习模型。