本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

报码:用Sklearn创建ML分类器模型,不用数学公式也可以(2)

时间:2017-06-06 03:41来源:香港现场开奖 作者:118KJ 点击:
添加许多不包含任何信息的特征使得模型不必要地变慢,并且冒着弄乱模型来尝试适应无信息的特征的风险。除此之外,具有许多特征会增加你的模型过度

添加许多不包含任何信息的特征使得模型不必要地变慢,并且冒着弄乱模型来尝试适应无信息的特征的风险。除此之外,具有许多特征会增加你的模型过度拟合(稍后详解)的风险。

正如经验所示,你希望以尽可能少的特征来获得尽可能多的数据信息。

我们也可以使用诸如主成分分析(PCA)这样的组合技术,将诸如房间数、居住面积和窗户数量的相关特征从上述示例组合到更高级别的主要组件中去,例如大小。虽然我们在本教程中不会使用这些技术,但应该知道它们是存在的。

确定特征相关性的一个有效方式是,通过绘制它们与其他特征的关系来实现。下面我们使用plot.scatter()子类方法绘制两轴之间的关系。

df.plot.scatter(x="SepalLengthCm", y="SepalWidthCm") plt.show()

上图正确地显示了萼片长度和萼片宽度之间的关系,然而,很难看出是否有任何的分组,因为没有指示一个数据点所代表的花的真实种类。

不过幸运的是,使用seaborn FacetGrid是很容易实现这一点的,我们可以使用列来驱动散点的颜色或色调。

sns.FacetGrid(df, hue="Species").map(plt.scatter, "SepalLengthCm", "SepalWidthCm").add_legend() plt.show()

大家可以看到,这样结果就好多了。

使用上述函数与不同特征的组合,你会发现PetalLengthCm和PetalWidthCm聚集在相当明确的组中,如下图所示。

不过值得注意的是,为何iris-versicolor和iris-virginca之间的界限直观看起来是很模糊的。这可能会给一些分类器带来麻烦,而且这值得在训练时被牢记。

我怎么知道该如何创建这些图?

我在谷歌上搜索了一下。

在搜索机器学习的时候,你会发现能够查找到的东西是至关重要的。有无数的东西要记住。花费大量时间尝试记住这些事情是非常低效的。而查看你所不确定的东西则会显得更有效率,并且会让你的大脑自动记住你经常使用的东西。

能够快速查找事物比记住整个sklearn文档更有价值。

好的一面是,sklearn是可扩展的记录,组织良好,且容易查找。除此之外,Sklearn还有一个非常和谐一致的界面;你可能会在整个教程中注意到它。

如果关联不同的特征以便选择最好的,这听起来像是一份浩大的工程,需要完成很多工作,不过我们应该注意的是,有自动化的方法可以来完成这个工作的,诸如kbest,和递归特征消除(recursive feature elimination),而这两个都可以在sklearn中得到。

准备由sklearn分类器训练的数据

现在我们已经选择了我们要使用的特征(PetalLengthCm和PetalWidthCm),我们需要准备数据,以便用sklearn使用它。

目前,所有的数据都是在DataFrame中编的,但是sklearn并不适用于pandas的DataFrames,所以我们需要提取特征和标签,并将它们转换成numpy数组。

分离标签是非常简单的,可以使用np.asarray()只用一行就可以完成。

labels = np.asarray(df.Species)

我们现在可以停止操作,因为我们可以使用上面的标签来训练分类器,但是,由于物种值的数据类型不是数字,而是字符串,我们在评估模型时就会遇到问题。

幸运的是,sklearn提供了一个漂亮的工具,可以将标签字符串编为数字表示。 它通过遍历标签数组,并将第一个唯一标签编码为0,然后将下一个唯一标签编码为1,依此类推……

使用labelencoder如下标准sklearn接口协议,你会很快熟悉。

from sklearn.preprocessing import LabelEncoder le = LabelEncoder() le.fit(labels) # apply encoding to labels labels = le.transform(labels)

下表显示了数据转换之前和之后的标签,并使用df.sample(5)进行创建。

After Before 139 2 Iris-virginica 87 1 Iris-versicolor 149 2 Iris-virginica 45 0 Iris-setosa 113 2 Iris-virginica

可以看到每个独一的字符串标签现在都有一个与它相关联的独一整数。如果我们想要返回字符串标签,我们可以使用le.inverse_transform(labels)。

特征的编码遵循类似的过程。

首先,我们要从DataFrame中删除我们不想要的所有特征列。 我们通过使用drop()方法来实现这个操作。

df_selected = df.drop(['SepalLengthCm', 'SepalWidthCm', "Id", "Species"], axis=1)

现在我们只剩下PetalLengthCm和PetalWidthCm列。

由于我们要使用多列,所以我们不能简单地使用np.asarray()。相反,我们可以使用to_dict()方法和sklearn的DictVectorizer。

df_features = df_selected.to_dict(orient='records')

用于DictVectorizer类的sklearn接口与LabelEncoder类似。 一个明显的区别是与fit_transform一起使用的.toarray()方法。

from sklearn.feature_extraction import DictVectorizer vec = DictVectorizer() features = vec.fit_transform(df_features).toarray()

既然我们已经有了数字特征和标签数组,剩下的要做的最后一件事就是把数据分成训练集和测试集。

为什么在训练所有数据的时候要有一个测试集?这可能是你会问的问题。

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容