![16461f22e3795dda756523a73626e8bc.png](https://i-blog.csdnimg.cn/blog_migrate/6527ed936cefa9fbb7e02f52b998d82f.jpeg)
介绍
Scikit-learn是一个Python库,我们在构建机器学习模型时都会不可避免地转向它。我已经使用这个很棒的库建立了无数模型,而且我敢肯定你们所有人也都必须拥有。
毫无疑问– scikit-learn提供了易于使用的语法易读的工具。在流行的Python库的万神殿中,scikit-learn与Pandas和NumPy一起排在最高级。这三个Python库为机器学习管道的各个步骤提供了完整的解决方案。
![051d787441e451f1934e8ce43b59295b.png](https://i-blog.csdnimg.cn/blog_migrate/25c5474e7719d674574dce0aa2f536ce.png)
我喜欢scikit-learn提供的简洁,统一的代码和功能。一旦我们掌握了其他技术,它真的很容易使用。出色的文档为您锦上添花,因为它使许多初学者在构建机器学习模型时能够自给自足。
scikit-learn的开发人员提出了一个新版本(v0.22),其中包含一些主要更新。我将在本文中为您解压缩这些功能,并通过Python代码展示其内幕。
注意:是否想从头开始学习Python?此免费课程是完美的起点!
目录
- 了解Scikit-Learn
- Scikit-Learn的简要历史
- Scikit-Learn v0.22更新(使用Python实现)
- 堆叠分类器和回归器
- 基于置换的特征重要性
- 对ROC-AUC的多类支持
- 基于kNN的插补
- 修剪树木
了解Scikit-Learn
该库建立在需要先安装的SciPy(科学Python)库上,然后才能使用scikit-learn。它是根据简化的BSD许可获得许可的,并在许多Linux发行版中分发,从而鼓励了学术和商业用途。
总体而言,scikit-learn在后台使用了以下库:
- NumPy:n维数组包
- SciPy:科学计算图书馆
- Matplotlib:绘图库
- iPython:交互式python(用于Jupyter Notebook支持)
- SymPy:符号数学
- 熊猫:数据结构,分析和处理
最近,scikit-learn将其功能和包重组并重组为六个主要模块:
- 分类:确定对象属于哪个类别
- 回归:预测与对象关联的连续值属性
- 群集:用于对未标记的数据进行分组
- 降维:减少要考虑的随机变量的数量
- 模型选择:比较,验证和选择参数和模型
- 预处理:特征提取和归一化
scikit-learn提供了执行所有步骤的功能,从预处理,模型构建,选择正确的模型,超参数调整到解释机器学习模型的框架。
![4c67911b326321ea4afcd7b43644c64b.png](https://i-blog.csdnimg.cn/blog_migrate/f9efd2cd09b9500f15496232aac6ac9f.jpeg)
Scikit学习模块(来源:Scikit学习主页)
Scikit学习简史
Scikit-learn自2007年以scikits.learn开始以来已经走了很长一段路。这是一个很酷的琐事-scikit-learn是David Cournapeau的Google Summer of Code项目!
它由法国计算机科学与自动化研究所的Fabian Pedregosa,Gael Varoquaux,Alexandre Gramfort和Vincent Michel接管并重写,并且于2010年首次公开发布。
从那时起,它成为许多语言和框架中最受欢迎的开源机器学习库,它添加了许多功能并经受住了时间的考验。我们的团队准备的下图显示了所有scikit学习功能及其版本号的简短时间表:
![74e2024e22d6deacd4ecdef9189dbb9a.png](https://i-blog.csdnimg.cn/blog_migrate/21b3bd91f24e894cfbe5998526662a76.png)
功能发布(2010-2011年)
![1ac042f757c85b616fe2dfc1c3399dd3.png](https://i-blog.csdnimg.cn/blog_migrate/4af52ffbf42a0b6daf5b351ca7dc1cbb.png)
功能发布(2012年至2013年)
![c4eb75dffad2052b1be32829734dac45.png](https://i-blog.csdnimg.cn/blog_migrate/8a186b5687448786b319a1067740c60b.png)
发布的功能(2013-2017)
![4b6a813ed4ff47a5828fe98aacaf44e7.png](https://i-blog.csdnimg.cn/blog_migrate/7422b8182e5dc6d8118c4f707f7e4013.png)
发布的功能(2018-2019)
上面的信息图显示了自2010年到2019年作为用于实施机器学习算法的公共库以来的功能发布
如今,Scikit学习已被全球各地的组织所使用,包括Spotify,JP Morgan,http://Booking.com,Evernote等。您可以在此处找到推荐书的完整列表,我相信这只是冰山一角,因为涉及该库的流行程度,因为在原型模型的某个阶段,将有很多大小公司在使用scikit-learn。
scikit-learn的最新版本v0.22如今有20多个活跃的参与者。v0.22在其军械库中添加了一些出色的功能,这些功能可以解决现有的一些主要痛点,并提供一些其他库中可用的新功能,但这些新功能通常会导致程序包冲突。
我们将在这里详细介绍它们,并深入探讨如何在Python中实现它们。
Scikit-Learn v0.22更新
除错误修复和性能改进外,这是scikit-learn的最新版本中包含的一些新功能。
堆叠分类器和回归器
堆叠是DataHack&Kaggle的机器学习竞赛获奖者流行的更高级的集成技术之一。让我们首先尝试简要了解它是如何工作的。
堆叠是一种集成学习技术,它使用来自多个模型(例如,决策树,KNN或SVM)的预测来构建新模型。
该模型用于对测试集进行预测。以下是我从这篇有关集成学习的优秀文章中获取的逐步解释,该文章是关于简单的集成集成的:
- 火车分为10个部分:
![40d6f379c1adb32b9f58aca39de88ad5.png](https://i-blog.csdnimg.cn/blog_migrate/84f188f05548886200c8b9b3179e4489.png)
- 在9个部分上拟合一个基础模型(假设决策树),并为第10个部分进行预测。这是针对火车组的每个部分完成的:
![f5a7fa73f13cce69bcd561400060ef51.png](https://i-blog.csdnimg.cn/blog_migrate/7732ff1238d38ebe5457af2b63e9752f.png)
- 然后将基础模型(在这种情况下为决策树)拟合到整个火车数据集中
- 使用此模型,可以对测试集进行预测:
![2e36ff443b3aa1233ae238b51f18f4dd.png](https://i-blog.csdnimg.cn/blog_migrate/26a8f2fef0236744ddb70722ad7c6827.png)
- 对另一个基本模型(例如KNN)重复步骤2到4,得出火车组和测试组的另一组预测:
![7af66489c688d45ce3ce8649244bf462.png](https://i-blog.csdnimg.cn/blog_migrate/be4fa4b74b8b1ffffc7e4986d6bef2db.png)
- 来自火车集合的预测将用作构建新模型的功能:
![68cc08e36b8610c9d259eea6521e0a22.png](https://i-blog.csdnimg.cn/blog_migrate/bf64d2d6aee1b3293ab97fa73799913a.png)
- 该模型用于对测试预测集进行最终预测
该mlxtend库提供了Python中实现堆叠的API。现在,sklearn及其熟悉的API可以执行相同的操作,并且非常直观,如下面的演示所示。您可以根据用例导入StackingRegressor和StackingClassifier:
从 sklearn.linear_model 导入 LogisticRegression
从sklearn.ensemble导入RandomForestClassifier
从sklearn.tree导入DecisionTreeClassifier
从 sklearn.ensemble 进口 StackingClassifier
从 sklearn.model_selection 进口 train_test_split
X , y = load_iris (return_X_y = True )
估计量 = [
('rf' , RandomForestClassifier (n_estimators = 10 , random_state = 42 )),
('dt' , DecisionTreeClassifier (random_state = 42 ))
]
clf = StackingClassifier (估计量= 估计量, final_estimator = LogisticRegression())
X_train , X_test , y_train , y_test = train_test_split (X , y , 分层= y , random_state = 42 )
clf 。适合(X_train , y_train )。得分(X_test , y_test )
基于置换的特征重要性
顾名思义,该技术提供了一种通过排列每个功能并捕获性能下降来为每个功能分配重要性的方法。
但是置换在这里意味着什么?让我们通过一个例子来理解这一点。
假设我们正在尝试预测房价,并且只能使用以下两种功能:
- LotArea –(房子的平方英尺)
- YrSold(销售年份)
测试数据只有10行,如下所示:
![34be9b24ac133922e12ab5c2513929c3.png](https://i-blog.csdnimg.cn/blog_migrate/516741273b625f21a2d0099c06ad1c39.jpeg)
接下来,我们拟合一个简单的决策树模型,并得到0.78的R平方值。我们选择一个功能,例如LotArea,并对其进行混洗,使所有其他列保持原样:
![167d40df02634968e783d2c38cfe560d.png](https://i-blog.csdnimg.cn/blog_migrate/9a472805f7a84b4d3d3e9887c4b652a8.jpeg)
接下来,我们再次计算R平方,结果为0.74。我们采用两者之间的差异或比率(0.78 / 0.74或0.78-0.74),重复上述步骤,并取平均值代表LotArea功能的重要性。
我们可以对所有其他功能执行类似的步骤,以获得每个功能的相对重要性。由于我们在此处使用测试集评估重要性值,因此只有有助于模型更好地概括的功能才能表现更好。
之前,我们必须从头开始实现此目的,或导入诸如ELI5之类的软件包。现在,Sklearn具有内置的功能,可以执行基于置换的特征重要性。让我们进入代码,看看如何可视化此代码:
从sklearn.ensemble导入RandomForestClassifier 从sklearn.inspection导入permutation_importance 从sklearn.datasets导入make_classification #使用Sklearn make分类创建一个虚拟数据集,其中包含7个重要变量中的3个 X,y = make_classification(random_state = 0,n_features = 7,n_informative = 3) 射频= RandomForestClassifier(random_state = 0).fit(X,y) 结果= permutation_importance(rf,X,y, n_repeats = 10,#每个功能必须改组的次数 random_state = 0,#随机状态固定,可再现 n_jobs = -1)#使用所有内核的并行处理 无花果,ax = plt.subplots() sorted_idx = result.importances_mean.argsort() ax.boxplot(result.importances [sorted_idx] .T, vert = False,labels = range(X.shape [1])) ax.set_title(“每个功能的排列重要性”) ax.set_ylabel(“功能”) fig.tight_layout() plt.show()
![1e2de5b8205023c0a617511e169786b7.png](https://i-blog.csdnimg.cn/blog_migrate/287d122fb5a228ee0c7167bdc771e858.png)
从上面的方框图中可以看出,有3个功能相对于其他4个功能更为重要。您可以在任何模型中进行尝试,这使其成为模型不可知的可解释性技术。您可以在此处阅读有关此机器学习可解释性概念的更多信息。
对ROC-AUC的多类支持
二进制分类的ROC-AUC分数超级有用,尤其是在涉及不平衡数据集时。但是,到目前为止,尚无对多类分类的支持,我们必须手动进行编码。为了将ROC-AUC分数用于多类别/多标签分类,我们需要首先对目标进行二值化。
当前,sklearn支持两种策略以实现此目的:
- 一对一:计算每对类的成对ROC AUC分数的平均值(平均值=“宏”)<image>
- 一个vs.休息:计算每个类别相对于其他所有类别的ROC AUC分数的平均值(平均值=“加权”)<image>
从sklearn.datasets导入load_iris 从sklearn.ensemble导入RandomForestClassifier 从sklearn.metrics导入roc_auc_score X,y = load_iris(return_X_y = True) 射频= RandomForestClassifier(random_state = 44,max_depth = 2) rf.fit(X,y) 打印(roc_auc_score(y,rf.predict_proba(X),multi_class ='ovo'))
![8e042fb117a952bc929308baa73f249c.png](https://i-blog.csdnimg.cn/blog_migrate/4f75ea2997d4fa701e5c8c983fe11358.png)
此外,还有一个新的绘图API,可以非常轻松地绘制和比较来自不同机器学习模型的ROC-AUC曲线。让我们看一个快速演示:
从 sklearn.model_selection 进口 train_test_split
从 sklearn.svm 进口 SVC
从 sklearn.metrics 进口 plot_roc_curve
从 sklearn.ensemble 进口 RandomForestClassifier
从 sklearn.datasets 进口 make_classification
进口 matplotlib.pyplot 如 PLT
X , y = make_classification (random_state = 5 )
X_train , X_test , y_train , y_test = train_test_split (X , y , random_state = 42 )
svc = SVC (random_state = 42 )
svc 。适合(X_train , y_train )
rfc = RandomForestClassifier (random_state = 42 )
rfc 。适合(X_train , y_train )
svc_disp = plot_roc_curve (SVC , X_test , y_test )
rfc_disp = plot_roc_curve (RFC , X_test , y_test , 斧= svc_disp 。ax_ )
rfc_disp 。Figure_ 。字幕(“ ROC曲线比较” )
PLT 。显示()
![0bca7843a79c38eabb43d70811d1ca1d.png](https://i-blog.csdnimg.cn/blog_migrate/953b3310322c27c5eea5b7fac0ec2b85.png)
在上图中,我们比较了两种不同的机器学习模型,即支持向量分类器和随机森林。同样,您可以绘制更多的机器学习模型的AUC-ROC曲线并比较它们的性能。
基于kNN的插补
在基于kNN的插补方法中,使用与缺少值的属性最相似的属性来插补属性的缺失值。将kNN用于缺失值的假设是,根据其他变量,可以通过最接近该点的点的值来近似一个点值。
使用距离函数确定两个属性的相似性。以下是使用kNN的一些优点:
-
- k近邻可以预测定性和定量属性
- 不需要为缺少数据的每个属性创建预测性机器学习模型
- 考虑数据的相关结构
Scikit-learn使用欧几里德距离方法支持基于kNN的插补。让我们看一个快速演示:
进口 numpy的 作为 NP
从 sklearn.impute 进口 KNNImputer
X = [[4 , 6 , NP 。楠], [ 3 , 4 , 3 ], [ NP 。南, 6 , 5 ], [ 8 , 8 , 9 ]]
imputer = KNNImputer (N_NEIGHBORS = 2 )
打印(imputer 。fit_transform(X ))
![8afacd8c4f64e64003f584b271bb391b.png](https://i-blog.csdnimg.cn/blog_migrate/dead06b23db77dbe31e88158efa39b5d.png)
您可以在此处详细了解kNN的工作原理。
修剪树木
从根本上讲,修剪是一种用于减少决策树大小从而避免过度拟合的技术。这也扩展到其他基于树的算法,例如Random Forests和Gradient Boosting。这些基于树的机器学习方法提供诸如min_samples_leaf
和的参数, max_depth
以防止树过度拟合。
修剪提供了另一种选择来控制树的大小。XGBoost和LightGBM已将修剪整合到其实现中。但是,在Scikit-learn中早就应该使用手动修剪树的功能(R已经作为rpart软件包的一部分提供了类似的功能)。
在最新版本中,Scikit-learn提供了此修剪功能,一旦构建了树,就可以控制大多数基于树的估计器中的过拟合。有关如何以及为什么进行修剪的详细信息,您可以阅读 Sunil撰写的有关基于树的方法的出色教程。现在让我们看一个快速演示:
从sklearn.ensemble导入RandomForestClassifier
从sklearn.datasets导入make_classification
X , y = make_classification (random_state = 0 )
射频 = RandomForestClassifier (random_state = 0 , ccp_alpha = 0 )。配合(X , Ý )
打印(“修剪的情况下的节点的平均数量{:.1F} ” 。 格式(NP 。平均值([ ë 。tree_ 。node_count 为ê 在RF 。estimators_ ))])
射频 = RandomForestClassifier (random_state = 0 , ccp_alpha = 0.1 )。配合(X , Ý )
打印(“与修剪节点的平均数量{:.1F} ” 。 格式(NP 。平均值([ ë 。tree_ 。node_count 为ê 在RF 。estimators_ ))])
![e38b4ca38d193babaaa5dfa734aea217.png](https://i-blog.csdnimg.cn/blog_migrate/f66a8ef1761e3fd3ec2aa8e9b3e442e5.png)