使用sklearn对IBM Watson进行机器学习
在本案例中,我们将学习如何使用sklearn库进行机器学习任务。为此我们将使用IBM Watson提供的SalesWinLoss数据集。我们将用pandas导入该数据集,并使用pandas库的一些方法,如探索数据head()
,tail()
,dtypes()
,然后利用绘图Seaborn
库,可视化我们的数据。
然后,我们将深入研究sklearn,并preprocessing.LabelEncoder()
在sklearn中使用它来处理数据,并将train_test_split()
数据集拆分为测试样本和训练样本。我们还将使用备忘单来帮助我们决定对数据集使用哪种算法。最后,我们将使用accuracy_score()
sklearn库提供的方法,使用三种不同的算法(朴素贝叶斯,LinearSVC,K邻居分类器)进行预测并比较其性能。我们还将使用sklearn和Yellowbrick可视化来可视化不同模型的性能得分。
数据集
我们将使用IBM Watson网站上可用的Sales-Win-Loss数据集。该数据集包含汽车零件批发供应商的销售活动数据。
我们将使用sklearn建立一个预测模型,以告诉我们哪些销售活动将导致亏损,哪些将导致获胜。
让我们从导入数据集开始。
导入数据集
首先,我们将导入pandas模块
#import necessary modules
import pandas as pd
接下来,我们将使用read_csv()
pandas模块提供的方法来读取csv
包含逗号分隔值的文件,并将其转换为pandas dataframe 。
# Read in the data with `read_csv()`
sales_data = pd.read_csv('/share/datasets/WA_Fn-UseC_-Sales-Win-Loss.csv')
上面的代码段返回一个变量sales_data
,该变量现在存储在数据帧中。
对于那些刚接触pandas的人,pd.read_csv()
上面的代码中的方法创建了一个称为a的表格数据结构Dataframe
,其中第一列包含唯一地标记每一行数据的索引,第一行包含每一列的标签/名称。 ,这是从数据集中保留的原始列名。sales_data
上面的代码片段中的变量将具有类似于下图的结构。
在上图中,row0,row1,row2是数据集中每个记录的索引,而col0,col1,col2等是数据集中每个列(功能)的列名。
现在,我们已经从数据源下载了数据集并将其转换为pandas dataframe ,现在让我们显示该 dataframe 的一些记录。为此,我们将使用该head()
方法。
# Using .head() method to view the first few records of the data set
sales_data.head()
从上面的显示中可以看出,该head()
方法向我们显示了数据集中的前几条记录。该head()
方法是pandas提供的一种非常漂亮的工具,可以帮助我们了解数据集的内容。head()
在下一节中,我们将详细讨论该方法。
数据探索
现在,我们已经下载了数据集并将其转换为pandas dataframe ,让我们快速浏览数据,看看数据可以告诉我们什么故事,以便我们计划行动方案。
在任何数据科学或机器学习项目中,数据探索都是非常重要的一步。即使快速浏览数据集也可以为我们提供否则可能会丢失的重要信息,并且该信息可以提出重要问题,我们可以尝试通过项目来回答。
我们可以从使用head()
方法开始,以查看导入的数据集的前几条记录,因为head()
实际上它的功能远远超过此!我们可以自定义head()
方法以仅显示特定数量的记录:
# Using head() method with an argument which helps us to restrict the number of initial records that should be displayed
sales_data.head(n=2)
在上面的代码片段中,我们在head()
方法内部使用了一个参数,仅显示数据集中的前两个记录。参数中的整数“ 2” n=2
实际上表示数据index
帧的第二个Sales_data
。使用此工具,我们可以快速了解必须处理的数据类型。例如,我们可以看到诸如“ Supplies Group”和“ Region”之类的列包含字符串数据,而诸如Opportunity Result,Opportunity Number等的列包含整数。此外,我们可以看到“机会编号”列包含每条记录的唯一标识符。
现在,我们已经查看了 dataframe 的初始记录,让我们尝试查看数据集中的最后几条记录。可以使用tail()
方法来完成此操作,该方法的语法与该head()
方法相似。让我们看看该tail()
方法可以做什么:
# Using .tail() method to view the last few records from the dataframe
sales_data.tail()
tail()
上面的代码片段中的方法向我们返回了数据帧中的最后几条记录sales_data
。我们也可以将参数传递给该tail()
方法,以仅从 dataframe 中查看有限数量的记录:
# Using .tail() method with an argument which helps us to restrict the number of initial records that should be displayed
sales_data.tail(n=2)
现在,我们只能查看 dataframe 中的最后两个记录,如方法n=2
内部的参数所示tail()
。与该head()
方法类似,该方法的参数n=2
中的整数“ 2” tail()
指向数据集中最后两个记录中的第二个索引sales_data
。
这最后两个记录告诉我们什么故事?从 dataframe 中查看预告片记录的“机会编号”列,对于我们来说很明显,共有78,024条记录可用。从该tail()
方法显示的记录的“索引”编号可以明显看出这一点。
现在,如果我们能够看到此数据集中可用的不同数据类型,那就太好了;如果以后需要进行一些转换,此信息会很方便。我们可以使用dtypes()
pandas中的方法来做到这一点:
# using the dtypes() method to display the different datatypes available
sales_data.dtypes
正如我们在上面的代码片段中所看到的,使用该dtypes
方法,我们可以列出Dataframe中可用的不同列以及它们各自的数据类型。例如,我们可以看到“耗材子组”列是object
数据类型,“按收入划分的客户规模”列是integer
数据类型。因此,现在我们知道哪些列中包含整数,哪些列中包含字符串数据。
数据可视化
现在,我们已经完成了一些基本的数据探索,让我们尝试创建一些漂亮的图来直观地表示数据并发现隐藏在数据集中的更多故事。
有许多python库提供用于进行数据可视化的功能。一个这样的库是Seaborn
。要使用Seaborn绘图,我们应该确保已下载并安装了该python模块。
让我们设置使用Seaborn
模块的代码:
%matplotlib inline
# import the seaborn module
import seaborn as sns
# import the matplotlib module
import matplotlib.pyplot as plt
# set the background colour of the plot to white
sns.set(style="whitegrid", color_codes=True)
# setting the plot size for all plots
sns.set(rc={'figure.figsize':(11.7,8.27)})
# create a countplot
sns.countplot('Route To Market',data=sales_data,hue = 'Opportunity Result')
# Remove the top and down margin
sns.despine(offset=10, trim=True)
# display the plotplt.show()
现在我们已经完成了Seaborn的设置,让我们更深入地了解我们所做的事情。
首先,我们导入了Seaborn模块和matplotlib模块。set()
下一行中的方法有助于为绘图设置不同的属性,例如“样式”,“颜色”等。使用sns.set(style="whitegrid", color_codes=True)
代码段将绘图的背景设置为浅色。然后,使用sns.set(rc={'figure.figsize':(11.7,8.27)})
代码段设置图形大小,该代码段将图形大小定义为11.7px和8.27px。
接下来,我们使用创建图sns.countplot('Route To Market',data=sales_data,hue = 'Opportunity Result')
。该countplot()
方法可帮助我们创建一个计数图,并公开了几个参数以根据需要定制计数图。在此,在方法的第一个参数中countplot()
,我们将X轴定义为数据集中的“通往市场的路线”列。第二个参数是数据源,在这种情况下,它是sales_data
我们在本教程第一部分中创建的 dataframe 。第三个参数是条形图的颜色,在 dataframe 的“机会结果”列中,我们将其分配为标签“获胜”的标签为“蓝色”,为标签为“损失”的标签分配为“绿色” sales_data
。
那么,图能告诉我们有关数据的什么信息?第一件事是,数据集具有“亏损”类型的记录多于“获胜”类型的记录,从条形图的大小可以看出。查看x轴以及x轴上每个标签的对应条形,我们可以看到我们数据集中的大多数数据都集中在图表的左侧:朝向“现场销售”和“经销商”类别。要注意的另一件事是,“现场销售”类别的损失比“经销商”类别的损失更大。
我们为绘图选择了“路线到市场”列,因为在初步研究head()
and tail()
方法的输出之后,它似乎将提供有用的信息。但是其他区域(如“区域”,“供应组”等)也可以用于以相同方式绘制图。
现在我们已经对整体数据有了一个很好的可视化,让我们看看在其他Seaborn绘图的帮助下我们可以挖掘出更多的信息。另一个流行的选择是violinplots
,因此让我们创建一个小提琴图,看看该图风格可以告诉我们什么。
我们将使用violinplot()
Seaborn模块提供的方法来创建小提琴图。首先,导入seaborn
模块并使用该set()
方法来自定义绘图的大小。我们将看到图的大小为16.7px x 13.27px:
# import the seaborn module
import seaborn as sns
# import the matplotlib module
import matplotlib.pyplot as plt
# setting the plot size for all plots
sns.set(rc={'figure.figsize':(16.7,13.27)})
接下来,我们将使用该violinplot()
方法创建小提琴图,然后使用show()
方法来显示该图–
# plotting the violinplot
sns.violinplot(x="Opportunity Result",y="Client Size By Revenue", hue="Opportunity Result", data=sales_data);
plt.show()
现在,我们的情节已经创建,让我们看看它告诉我们什么。小提琴图以最简单的形式显示标签上数据的分布。在上面的图中,我们在x轴上具有标签“获胜”和“亏损”,在y轴上具有“按收入划分的客户规模”的值。小提琴图显示出最大的数据分布是在客户端大小“ 1”中,其余的客户端大小标签中的数据较少。
此小提琴图使我们对数据的分布方式,哪些特征和标签具有最大的数据集中度具有非常有价值的洞察力,但是在小提琴图的情况下,所见之处不止于此。您可以通过该模块的官方文档更深入地了解小提琴图的其他用途Seaborn
预处理数据
既然我们对数据的外观有了很好的了解,那么我们就可以开始准备使用sklearn构建预测模型了。
在最初的探索中,我们看到数据集中的大多数列都是字符串,但是sklearn中的算法仅理解数字数据。幸运的是,sklearn库为我们提供了许多将字符串数据转换为数字数据的方法。一种这样的方法是该LabelEncoder()
方法。我们将使用此方法将数据集中的分类标签(例如“赢”和“损失”)转换为数字标签。为了可视化我们试图通过该LabelEncoder()
方法实现的目标,让我们考虑下图。
下图表示一个 dataframe ,该 dataframe 具有一个名为“ color”的列和三个记录“ Red”,“ Green”和“ Blue”的记录。
由于sklearn中的机器学习算法仅理解数字输入,因此我们希望将“红色”,“绿色”和“蓝色”等类别标签转换为数字标签。当我们完成了原始数据帧中的分类标签的转换后,我们将得到如下内容:
现在,让我们开始实际的转换过程。我们将使用fit_transform()
提供的方法LabelEncoder()
对分类列中的标签进行编码,例如sales_data
dataframe 中的“通往市场的路线”,然后将它们转换为类似于上图所示的数字标签。该fit_transform()
函数将用户定义的标签作为输入,然后返回编码的标签。让我们来看一个简单的示例,以了解编码是如何完成的。在下面的代码示例中,我们有一个城市列表,例如["paris", "paris", "tokyo", "amsterdam"]
,我们将尝试将这些字符串标签编码为类似于–的内容[2, 2, 1,3]
。
#import the necessary module
from sklearn import preprocessing
# create the Labelencoder object
le = preprocessing.LabelEncoder()
#convert the categorical columns into numeric
encoded_value = le.fit_transform(["paris", "paris", "tokyo", "amsterdam"])
print(encoded_value)
瞧!我们已经成功地将字符串标签转换为数字标签。我们怎么做到的?首先,我们导入了preprocessing
提供该LabelEncoder()
方法的模块。然后,我们创建了一个代表LabelEncoder()
类型的对象。接下来,我们使用该对象的fit_transform()
函数来区分列表的不同唯一类,["paris", "paris", "tokyo", "amsterdam"]
然后返回带有相应编码值(即)的列表[1 1 2 0]
。
请注意,该LabelEncoder()
方法是如何按照原始列表中类的第一个字母的顺序将数值分配给类的:“(a)msterdam”获得的编码为“ 0”,“(p)aris获得的编码为1” ”和“(t)okyo”的编码为2。
在LabelEncoder()
各种编码要求下,它们提供了许多方便的功能。我们在这里不需要它们,但是要了解更多信息,一个不错的起点是sklearn的官方页面,其中LabelEncoder()
详细描述了及其相关功能。
由于我们现在对LabelEncoder()
工作原理有了很好的了解,因此可以继续使用此方法来对sales_data
数据帧中的分类标签进行编码,并将其转换为数字标签。在对数据集进行初步探索期间的前几节中,我们看到以下各列包含字符串值:“供应子组”,“区域”,“进入市场的路线”,“机会结果”,“竞争对手类型”和“供应”组'。在开始对这些字符串标签进行编码之前,让我们快速看一下这些列包含的不同标签:
print("Supplies Subgroup' : ",sales_data['Supplies Subgroup'].unique())
print("Region : ",sales_data['Region'].unique())
print("Route To Market : ",sales_data['Route To Market'].unique())
print("Opportunity Result : ",sales_data['Opportunity Result'].unique())
print("Competitor Type : ",sales_data['Competitor Type'].unique())
print("'Supplies Group : ",sales_data['Supplies Group'].unique())
现在,我们从sales_data
dataframe 中布置了不同的分类列,并在每个列下布置了唯一的类。现在,是时候将这些字符串编码为数字标签了。为此,我们将运行以下代码,然后深入研究其工作原理:
#import the necessary module
from sklearn import preprocessing
# create the Labelencoder object
le = preprocessing.LabelEncoder()
#convert the categorical columns into numeric
sales_data['Supplies Subgroup'] = le.fit_transform(sales_data['Supplies Subgroup'])
sales_data['Region'] = le.fit_transform(sales_data['Region'])
sales_data['Route To Market'] = le.fit_transform(sales_data['Route To Market'])
sales_data['Opportunity Result'] = le.fit_transform(sales_data['Opportunity Result'])
sales_data['Competitor Type'] = le.fit_transform(sales_data['Competitor Type'])
sales_data['Supplies Group'] = le.fit_transform(sales_data['Supplies Group'])
#display the initial records
sales_data.head()
那我们刚才做了什么?首先,我们导入了preprocessing
提供该LabelEncoder()
方法的模块。然后,我们创建le
了类型的对象labelEncoder()
。在接下来的两行中,我们使用了fit_transform()
提供的功能,LabelEncoder()
并将“供应子组”,“区域”,“投放市场”等不同列的分类标签转换为数字标签。为此,我们成功地将所有分类(字符串)列转换为数值。
现在我们已经准备好数据并进行了转换,几乎可以将其用于构建我们的预测模型了。但是我们仍然需要做一件关键的事情:
训练集和测试集
需要对一组数据训练机器学习算法,以学习不同特征之间的关系以及这些特征如何影响目标变量。为此,我们需要将整个数据集分为两组。一个是训练集,我们将在该训练集上训练算法以建立模型。另一个是测试集,我们将在该测试集上测试模型以查看其预测的准确性。
但是在进行所有拆分之前,我们先将功能和目标变量分开。如本教程之前所述,我们将首先运行以下代码,然后仔细查看其功能:
# select columns other than 'Opportunity Number','Opportunity Result'
cols = [col for col in sales_data.columns if col not in ['Opportunity Number','Opportunity Result']]
# dropping the 'Opportunity Number'and 'Opportunity Result' columns
data = sales_data[cols]
#assigning the Oppurtunity Result column as target
target = sales_data['Opportunity Result']
data.head(n=2)
好,那我们刚才做了什么?首先,我们不需要“机会编号”列,因为它只是每条记录的唯一标识符。另外,我们希望预测“机会结果”,因此它应该是我们的“目标”而不是“数据”的一部分。因此,在上述代码的第一行中,我们仅选择了与“商机编号”和“商机结果”不匹配的列,并将它们分配给了变量cols
。接下来,我们data
使用list中的列创建了一个新的 dataframe cols
。这将用作我们的功能集。然后,我们从 dataframe 中获取“机会结果”列,sales_data
并创建了一个新的 dataframe target
。
而已!我们已经准备好定义我们的功能并将目标定为两个单独的 dataframe 。下一步,我们将分dataframes data
并target
投入到训练集和测试集。拆分数据集时,我们将保留30%的数据作为测试数据,其余70%作为训练数据。但是请记住,这些数字是任意的,最佳分割取决于您使用的特定数据。如果您不确定如何拆分数据,则将80%的数据保留为训练数据,而将其余20%的数据用作测试数据的80/20原则是不错的默认选择。但是,对于本教程,我们将坚持我们先前的决定,即保留30%的数据作为测试数据。的train_test_split()
在方法scikit学习可用于分割数据:
#import the necessary module
from sklearn.model_selection import train_test_split
#split data set into train and test sets
data_train, data_test, target_train, target_test = train_test_split(data,target, test_size = 0.30, random_state = 10)
这样,我们现在已经成功地准备了测试集和培训集。在上面的代码中,我们首先导入了traintestsplit模块。接下来,我们使用该train_test_split()
方法将数据分为训练集(datatrain,targettrain)和测试集(datatest,datatrain)。方法的第一个参数train_test_split()
是我们在上一节中分离出的功能,第二个参数是target('Opportunity Result')。第三个参数'testsize'是我们想作为训练数据分离出来的数据的百分比。在我们的例子中是30%,尽管可以是任何数字。第四个参数“ randomstate”仅确保我们每次都能获得可重复的结果。
现在,我们已经准备就绪,这是本教程最重要,最有趣的部分:使用sklearn提供的庞大算法库构建预测模型。
建立模型
scikit Learn的网站上有machine_learning_map
可用的内容,可供我们在选择算法时用作快速参考。看起来像这样:
我们可以将此地图用作备忘单,以简短列出可以尝试构建预测模型的算法。使用清单,让我们看看我们属于哪一类:
- 超过50个样本–检查
- 我们要预测类别吗?
- 我们已标记数据?(带有明确名称的数据,例如机会金额等)–检查
- 少于10万个样本–检查
根据上面准备的清单,我们machine_learning_map
可以尝试以下提到的算法。
- 朴素贝叶斯
- 线性SVC
- K邻居分类器
sklearn库的真正优点在于,它公开了适用于不同算法的高级API,这使我们更容易尝试不同算法并比较模型的准确性,从而确定最适合我们的数据集的方法。
让我们开始尝试一种不同的算法。
朴素贝叶斯
sklearn提供了一组分类算法,这些分类算法“天真”地假设在数据集中每对特征都是独立的。这个假设是贝叶斯定理的基本原理。基于此原理的算法称为朴素贝叶斯算法。
在非常高的水平上,朴素贝叶斯算法会计算特征与目标变量的连接概率,然后选择概率最高的特征。让我们尝试用一个非常简单的问题陈述来理解这一点:今天会下雨吗?假设我们拥有一组天气数据,这将成为我们的特征集,而“降雨”的概率将成为我们的目标。基于此功能集,我们可以创建一个表以向我们显示特定功能/目标对的出现次数。它看起来像这样:
在上方的表格(列)中,“天气”包含标签(“部分多云”和“多云”),“雨”列包含与“天气”特征一致的下雨发生(是/否)。每当某项特征下雨时,就会记录为“是”,而当该特征没有导致下雨时,则会记录为“否”。现在,我们可以使用出现表中的数据来创建另一个称为“频率表”的表,在该表中,我们可以记录每个功能所涉及的“是”和“否”答案的数量:
最后,我们结合来自“出现表”和“频率表”的数据,并创建一个“可能性表”。下表列出了每个功能部件的“是”和“否”的数量,然后使用此数据来计算每个功能部件对降雨的影响概率:
请注意上表中的“个体概率”列。我们从“出现表”和“似然表”中出现了6次“部分多云”和“多云”特征,很明显,特征“部分多云”有4次出现(对于“否”为2次,对于“部分多云”为2次)。 '是')。当我们将某个特定特征的“否”和“是”的出现次数除以“出现表”的“总数”时,我们就可以得出该特定特征的概率。在我们的案例中,如果我们需要找出哪个要素最有可能促成降雨的发生,则我们将每个要素的“否”总数取为“”,然后将其加到“频率表”,然后将总和除以“合计表”中的“总计”。
我们将用于销售数据的算法是Gaussian Naive Bayes
,它基于与上面刚刚探讨的天气示例类似的概念,尽管在数学上要复杂得多。对于那些想深入研究的人,可以在这里找到“朴素贝叶斯”算法的更详细说明。
现在让我们实现GaussianNB
sklearn 的高斯朴素贝叶斯或算法来创建我们的预测模型:
# import the necessary module
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
#create an object of the type GaussianNB
gnb = GaussianNB()
#train the algorithm on training data and predict using the testing data
pred = gnb.fit(data_train, target_train).predict(data_test)
#print(pred.tolist())
#print the accuracy score of the model
print("Naive-Bayes accuracy : ",accuracy_score(target_test, pred, normalize = True))
现在,让我们仔细看看我们所做的。首先,我们导入了GaussianNB
方法和accuracy_score
方法。然后,我们创建gnb
了类型的对象GaussianNB
。此后,我们使用该fit()
方法对测试数据(datatrain)和测试目标(targettrain)进行了算法训练,然后使用该方法预测了测试数据中的目标predict()
。最后,我们使用该accuracy_score()
方法打印了分数,并以此成功地将Naive-Bayes
算法应用到了预测模型的构建中。
现在让我们看看列表中的其他算法与Naive-Bayes算法相比的性能如何。
线性SVC
LinearSVC或线性支持向量分类是SVM
(支持向量机)类的子类。我们不会涉及这类算法中的复杂数学问题,但在最基本的层次上,LinearSVC会尝试将数据划分为不同的平面,以便可以找到不同类别的最佳分组。为了清楚地理解这个概念,让我们想象一下“点”和“正方形”的数据集沿两个轴分为二维空间,如下图所示:
在上面的图像中,一种LinearSVC
实现方式尝试以这种方式划分二维空间,以便清楚地划分两类数据,即dots
和squares
。在这里,这两行直观地表示LinearSVC
尝试进行划分以分离出两个可用类的各种划分。
对于那些想要了解更多细节的人,Support Vector Machine(SVM)
可以在这里找到一篇很好的解释a的文章,但是现在,让我们深入研究一下
#import the necessary modules
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
#create an object of type LinearSVC
svc_model = LinearSVC(random_state=0)
#train the algorithm on training data and predict using the testing data
pred = svc_model.fit(data_train, target_train).predict(data_test)
#print the accuracy score of the model
print("LinearSVC accuracy : ",accuracy_score(target_test, pred, normalize = True))
与实施GaussianNB时所做的类似,我们在前两行中导入了所需的模块。然后,我们创建了svc_model
类型为LinearSVC 的对象,其中random_state为'0'。
稍等!什么是“ random_state”?简单地说,random_state
是对内置随机数生成器的指令,以特定顺序对数据进行随机排序。
接下来,我们在训练数据上训练了LinearSVC,然后使用测试数据预测了目标。最后,我们使用该accuracy_score()
方法检查了准确性得分。
现在我们已经尝试了GaussianNB
和LinearSVC
算法,我们将尝试列表中的最后一个算法,那就是K-nearest neighbours classifier
K近邻分类器
与我们使用的前两种算法相比,此分类器稍微复杂一些。就本教程而言,最好使用KNeighborsClassifier
sklearn提供的类,而不必担心算法的工作原理。(但是,如果您有兴趣,可以在此处找到有关此类算法的非常详细的说明)
现在,让我们实现K近邻分类器并查看其得分:
#import necessary modules
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
#create object of the lassifier
neigh = KNeighborsClassifier(n_neighbors=3)
#Train the algorithm
neigh.fit(data_train, target_train)
# predict the response
pred = neigh.predict(data_test)
# evaluate accuracy
print ("KNeighbors accuracy score : ",accuracy_score(target_test, pred))
可以像前面的实现一样解释上面的代码。首先,我们导入了必要的模块,然后创建了neigh
KNeighborsClassifier类型的对象,其邻居数为n_neighbors=3
。然后,我们使用该fit()
方法在训练集上训练我们的算法,然后在测试数据上测试了模型。最后,我们打印出准确性得分。
现在我们已经实现了列表中的所有算法,我们可以简单地比较所有模型的得分以选择得分最高的模型。但是,如果我们有一种直观地比较不同模型性能的方法,那岂不是很好吗?我们可以yellowbrick
在sklearn中使用该库,该库提供了直观地表示不同评分方法的方法。
性能比较
在前面的部分中,我们使用了该accuracy_score()
方法来测量不同算法的准确性。现在,我们将使用库ClassificationReport
提供的类为我们提供有关Yellowbrick
模型性能的直观报告。
安装yellowbrick
!pip3 install yellowbrick -i https://pypi.tuna.tsinghua.edu.cn/simple/
GaussianNB
让我们从GaussianNB
模型开始:
from yellowbrick.classifier import ClassificationReport
# Instantiate the classification model and visualizer
visualizer = ClassificationReport(gnb, classes=['Won','Loss'])
visualizer.fit(data_train, target_train) # Fit the training data to the visualizer
visualizer.score(data_test, target_test) # Evaluate the model on the test data
g = visualizer.poof() # Draw/show/poof the data
在上面的代码中,首先我们导入模块ClassificationReport
提供的类yellowbrick.classifier
。接下来,创建visualizer
该类型的对象ClassificationReport
。这里的第一个参数是在实现“朴素贝叶斯”部分中的算法时创建的GaussianNB
对象。第二个参数包含 dataframe “机会结果”列中的标签“获胜”和“损失” 。gnb``Naive-Bayes``sales_data
接下来,我们使用该fit()
方法来训练visualizer
对象。接下来是该score()
方法,该方法使用gnb
对象根据GaussianNB
算法执行预测,然后计算该算法做出的预测的准确性得分。最后,我们使用该poof()
方法为GaussianNB
算法绘制不同分数的图。请注意,如何分别对“ Won”和“ Loss”标签布置不同的分数;这使我们能够可视化不同目标类别的分数。
线性SVC
与我们在上一节中所做的类似,我们还可以绘制LinearSVC
算法的准确性得分:
from yellowbrick.classifier import ClassificationReport
# Instantiate the classification model and visualizer
visualizer = ClassificationReport(svc_model, classes=['Won','Loss'])
visualizer.fit(data_train, target_train) # Fit the training data to the visualizer
visualizer.score(data_test, target_test) # Evaluate the model on the test data
g = visualizer.poof() # Draw/show/poof the data
在上面的代码中,首先我们导入ClassificationReport
了yellowbrick.classifier
模块提供的类。接下来,创建一个visualizer
类型的对象ClassificationReport
。这里的第一个参数是LinearSVC
object svc_model
,它是LinearSVC
在“ LinearSVC”部分中实现算法时创建的。第二个参数包含sales_data
dataframe “机会结果”列中的标签“获胜”和“损失” 。
接下来,我们使用该fit()
方法来训练“ svc_model”对象。接下来是score()
一种方法,该方法使用svc_model
对象根据LinearSVC
算法进行预测,然后计算该算法做出的预测的准确性得分。最后,我们使用该poof()
方法为LinearSVC
算法绘制了不同分数的图。
KNN
现在,让我们对K邻居分类器分数做同样的事情。
from yellowbrick.classifier import ClassificationReport
# Instantiate the classification model and visualizer
visualizer = ClassificationReport(neigh, classes=['Won','Loss'])
visualizer.fit(data_train, target_train) # Fit the training data to the visualizer
visualizer.score(data_test, target_test) # Evaluate the model on the test data
g = visualizer.poof() # Draw/show/poof the data
再一次,我们首先导入模块ClassificationReport
提供的类yellowbrick.classifier
。接下来,创建visualizer
该类型的对象ClassificationReport
。这里的第一个参数是KNeighborsClassifier
object neigh
,它是在实现KNeighborsClassifier
“ KNeighborsClassifier”部分中的算法时创建的。第二个参数包含sales_data
dataframe “机会结果”列中的标签“获胜”和“损失” 。
接下来,我们使用该fit()
方法训练“邻居”对象。接下来是score()
一种方法,该方法使用neigh
对象根据KNeighborsClassifier
算法进行预测,然后计算该算法做出的预测的准确性得分。最后,我们使用该poof()
方法为KNeighborsClassifier
算法绘制了不同分数的图。
现在我们已经可视化了结果,现在我们可以轻松比较分数并选择最能满足我们需求的算法。
结论
sklearn库提供了许多不同的算法,这些算法可以导入到代码中,然后用于构建模型,就像我们导入其他任何Python库一样。这样可以更轻松地快速构建不同的模型,并比较这些模型以选择得分最高的模型。
在本教程中,我们仅介绍了sklearn库所能提供的功能。为了最大程度地使用此机器学习库,sklearn的官方页面上提供了许多资源,并提供了详细的文档供您参考。sklearn的快速入门指南可以在这里找到,对于刚开始探索机器学习世界的初学者来说,这是一个很好的切入点。
但是要真正欣赏sklearn库的真正功能,您真正需要做的是开始在不同的开放数据集上使用它,并使用这些数据集建立预测模型。开放数据集的来源包括Kaggle和Data.world。两者都包含许多有趣的数据集,可以使用sklearn库提供的算法在这些数据集上练习构建预测模型。
建议使用PC或笔记本电脑,浏览器使用Chrome或FireFox进行浏览,以开启左侧互动实验区来提升学习效率,推荐使用的分辨率为1920x1080或更高。
我们坚信最好的学习是参与其中这一理念,并致力成为中文互联网上体验更好的学练一体的IT技术学习交流平台。

您可加QQ群:575806994,一起学习交流技术,反馈网站使用中遇到问题。
内容、课程、广告等相关合作请扫描右侧二维码添加好友。
狐狸教程 Copyright 2021