网易首页 > 网易号 > 正文 申请入驻

4个Scikit-Learn工具

0
分享至

4个Scikit-Learn工具

2021-02-13 08:30·人工智能遇见磐创

数据科学项目往往包括预处理、特征工程、特征选择、训练、测试……在尝试多种选择甚至在生产环境中处理这些步骤时,可能会很快变得混乱。幸运的是,scikitlearn提供了一些选项,允许我们将多个estimator连成一个estimator。换句话说,像fit或predict这样的特定操作只需要在整个estimator序列上应用一次。

在本文中,我们将通过一个具体的项目与你分享其中的四种工具以及用例示例。

目录

  • Pipelines
  • Function Transformer
  • Column Transformer
  • Feature Union
  • 另一种语法:make_[composite_estimator]
  • 额外:可视化管道

热身

在我们开始探索scikit learn的工具之前,先获取一个可以使用的数据集。

这只是为了示范,所以你不一定要下载它(除非你想自己尝试代码)。

实际上我们偶然发现了一个名为datasets的python包,它允许你轻松下载500多个数据集:

importpandasaspdfromdatasetsimportload_datasetdataset=load_dataset("amazon_us_reviews",'Video_Games_v1_00',split='train')df=pd.DataFrame(dataset)

我们将使用亚马逊美国评论。它包含数字和文本特征(例如评论和获得的有用票数),目标特征是获得的星星数:https://huggingface.co/datasets/viewer/?dataset=amazon_us_reviews&config=Video_Games_v1_00

1-Pipelines

什么是Pipelines(管道)?

管道是为了方便起见,将estimator序列封装成单个序列的工具。

什么使它有用?

管道之所以方便,有多种原因:

  • 紧凑性:避免编写多行代码和担心estimator的顺序;
  • 清晰:易于阅读和可视化;
  • 易于处理:只需一个单一的行动就可以fit或者predict整个序列;
  • 联合参数选择:使用管道可以通过网格搜索一次性优化所有estimator的参数。

我如何在实践中使用它?

实际上,管道是由一组transformer和一个estimator组成的。

如果你不知道什么是transformer,你可以认为它是一个包含fit和transform方法的对象。

在本示例中,我们将使用TfidfVectorizer将评论从文本数据转换为数字数据,然后尝试使用RandomForestClassifier进行预测:

fromsklearn.pipelineimportPipelinefromsklearn.ensembleimportRandomForestClassifierfromsklearn.feature_extraction.textimportTfidfVectorizermodel=Pipeline([('vectorizer',TfidfVectorizer()),('clf',RandomForestClassifier())])model.fit(df['review_body'],df['star_rating'])

2.Function Transformer

什么是Function Transformer?

如前一节所述,transformer需要包含fit和transform方法。

FunctionTransformer是一个无状态的transformer,它是由你创建的callable构造的。

什么使它有用?

在某些情况下,需要执行不进行任何参数拟合的转换。在这种情况下,创建fit方法是没有用的。在这些情况下,FunctionTransformer将是最有用的。

我如何在实践中使用它?

数据集包含一个日期格式的特征。我们可以对日期进行转换的一个例子是提取年份。

以下是如何使用FunctionTransformer:

fromsklearn.preprocessingimportFunctionTransformertr=FunctionTransformer(lambdax:pd.to_datetime(x['review_date']).dt.year)

注意:如果lambda函数与FunctionTransformer一起使用,则生成的transformer将不可pickle。要知道的一件好事是,你可以通过使用cloudpickle包来解决这个问题。

3.Column Transformer

什么是Column Transformer?

根据数据集的不同,可能需要对数组或数据帧的不同列应用不同的转换。

Column Transformer允许在连接结果特征之前应用单独的转换。

什么使它有用?

这种estimator对于异构数据特别有用。在这种情况下,需要自定义特征提取机制或对列或列子集的数据类型进行转换。

我如何在实践中使用它?

在本例中,我们有文本数据和数字数据。下面是如何使用Column Transformer根据数据类型应用单独的转换:

fromsklearn.composeimportColumnTransformerfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.preprocessingimportNormalizerct=ColumnTransformer([("vectorizer",TfidfVectorizer(max_features=100),'review_body'),("normalizer",Normalizer(norm='l1'),['total_votes','helpful_votes'])])

正如预期的那样,ColumnTransformer的输出数据有102列:100列来自TF-IDFtransformer,2列来自Normalizer。

4-Feature Union

什么是Feature Union?

与ColumnTransformer类似,FeatureUnion将多个Transformer的结果连接起来。只是有些不同,因为每个transformer都将整个数据集作为其输入,而不是ColumnTransformer中的列子集。

就使用它们所能做的事情而言,这两种方法是相当等效的,但根据情况,其中一种可能更适合使用,并且需要的代码行数更少。

什么时候使用它?

FeatureUnion允许你将不同的特征提取变换器组合到一个Transformer中。

我如何在实践中使用它?

与前一种情况等效,我们可以使用由ColumnSelector和给定的transformer组成的管道来构造FeatureUnion。

我们将构造一个FeatureUnion,它执行与先前实现的ColumnTransformer相同的转换。

为此,我们将两个管道封装成一个FeatureUnion。每个管道链接一个ColumnSelector和一个给定的transformer。

scikit learn中没有预先实现的ColumnSelector,因此我们将使用FunctionTransformer构建自己的ColumnSelector:

fromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.pipelineimportFeatureUnionfromsklearn.pipelineimportPipelinefromsklearn.preprocessingimportFunctionTransformerfromsklearn.preprocessingimportNormalizervectorizer=Pipeline([('selector',FunctionTransformer(lambdax:df['review_body'])),('vectorizer',TfidfVectorizer(max_features=100))])normalizer=Pipeline([('selector',FunctionTransformer(lambdadf:df[['total_votes','helpful_votes']])),("normalizer",Normalizer(norm='l1'))])fu=FeatureUnion([("vectorizer",vectorizer),("normalizer",normalizer)])

另一种语法:make_[composite_estimator]

除了前面提到的方法之外,还有一些语法稍有不同的方法(Function Transformer除外)。

这些方法是:

  • make_pipeline(https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html#sklearn.pipeline.make_pipeline)
  • make_column_transformer(https://scikit-learn.org/stable/modules/generated/sklearn.compose.make_column_selector.html#sklearn.compose.make_column_selector)
  • make_union(https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_union.html#sklearn.pipeline.make_union)

这些是以前构造函数的简写。主要的区别是它们不要求,也不允许命名estimator。相反,组件名将自动设置为其类型的小写。

在大多数情况下,使用速记版本更简单、更清晰、更易读。但是,例如,如果需要执行网格搜索,则可能需要自定义estimator的名称。在这种情况下,为了清晰和紧凑,分配简短的可分辨名称可能很有用。

如果你不熟悉使用网格搜索进行参数优化,我们将很快就此撰写一篇文章。

你可以在下面看到应用于管道案例的两个版本之间的差异:

  • 管道语法:

pipe=Pipeline([('vec',TfidfVectorizer()),('clf',LogisticRegression()])param_grid={'clf__C':[1,10,100]}grid_search=GridSearchCV(pipe,param_grid)grid_search.fit(X,y)

  • make_pipeline相比:

pipe=make_pipeline(TfidfVectorizer(),LogisticRegression())param_grid={'logisticregression__C':[1,10,100]}grid_search=GridSearchCV(pipe,param_grid)grid_search.fit(X,y)

额外:可视化你的管道

Scikit Learn提供了一种使用以下代码行可视化你创建的复合estimator的简洁方法:

fromsklearn.pipelineimportPipelinefromsklearn.linear_modelimportLogisticRegressionfromsklearn.preprocessingimportFunctionTransformerfromsklearn.utilsimportestimator_html_repr#定义一个示例管道model=Pipeline([('transformer',FunctionTransformer(lambdax:2*x)),('clf',LogisticRegression())])withopen('model.html','w')asf:f.write(estimator_html_repr(model))

这将有效地创建一个以清晰的方式表示管道的交互式HTML文件。

如果你使用notebook,另一种方法是使用以下代码:

fromIPython.displayimportdisplayfromsklearn.pipelineimportPipelinefromsklearn.linear_modelimportLogisticRegressionfromsklearn.preprocessingimportFunctionTransformerfromsklearnimportset_configset_config(display='diagram')#定义一个示例管道model=Pipeline([('transformer',FunctionTransformer(lambdax:2*x)),('clf',LogisticRegression())])display(model)

结尾

管道和复合estimator是数据科学项目的强大工具,尤其是那些要放在生产环境中的项目。它们的附加价值不仅在于清晰和方便,还在于安全和防止数据泄漏。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
G5多少分?生死战场均得分:东契奇34.1分居首 詹姆斯压乔丹

G5多少分?生死战场均得分:东契奇34.1分居首 詹姆斯压乔丹

直播吧
2024-06-16 14:45:09
父亲头七刚过,分家产时养女自觉离开,上火车时却被哥嫂跩下来

父亲头七刚过,分家产时养女自觉离开,上火车时却被哥嫂跩下来

娱乐洞察点点
2024-06-03 16:54:38
华科紧追中科大,西交不敌武大!2024中国大学百强排行榜出炉

华科紧追中科大,西交不敌武大!2024中国大学百强排行榜出炉

水又木二
2024-06-16 11:36:01
拜仁死活不要的主帅,如今在德国队成座上宾,欧洲杯首战带队大胜

拜仁死活不要的主帅,如今在德国队成座上宾,欧洲杯首战带队大胜

罗掌柜体育
2024-06-15 15:01:11
快讯!普京下达最后通牒:泽连斯基肯撤军就立马停火

快讯!普京下达最后通牒:泽连斯基肯撤军就立马停火

笔墨V
2024-06-16 14:39:31
高考结束家长拆了放在孩子卧室6年的监控,网友:满满的窒息感,专家:培养自信更重要

高考结束家长拆了放在孩子卧室6年的监控,网友:满满的窒息感,专家:培养自信更重要

极目新闻
2024-06-14 10:52:19
强对流+高温!安徽气象台发布双预警

强对流+高温!安徽气象台发布双预警

金台资讯
2024-06-16 11:16:39
上港国脚因伤退出国家队 回中超踢满全场被质疑诈伤

上港国脚因伤退出国家队 回中超踢满全场被质疑诈伤

球事百科吖
2024-06-15 14:43:22
散学典礼校长讲话:中专生姜萍赢得全球数学竞赛前12名的3个理由

散学典礼校长讲话:中专生姜萍赢得全球数学竞赛前12名的3个理由

教育好文
2024-06-16 09:30:13
周鸿祎辟谣:小鸟壁纸不是360产品

周鸿祎辟谣:小鸟壁纸不是360产品

快科技
2024-06-15 18:18:15
闹大了,7旬老太偷菜摔成十级伤残,反要菜主赔偿8万,网友气炸了

闹大了,7旬老太偷菜摔成十级伤残,反要菜主赔偿8万,网友气炸了

金哥说新能源车
2024-06-16 02:43:00
南京杀妻案吉星鹏被判处死刑,临刑前他全身抽搐流泪不止

南京杀妻案吉星鹏被判处死刑,临刑前他全身抽搐流泪不止

一度历史观
2024-06-14 12:56:49
打死城管判死刑,被4名城管打死该咋判?湖南法院给出答案

打死城管判死刑,被4名城管打死该咋判?湖南法院给出答案

一个人讲故事
2023-12-07 18:03:33
老人存款最好的两种方法,内部人员透露,赶紧收藏起来

老人存款最好的两种方法,内部人员透露,赶紧收藏起来

户外钓鱼哥阿旱
2024-06-15 17:17:14
“他下周将赴中国,预计会激烈磋商”

“他下周将赴中国,预计会激烈磋商”

观察者网
2024-06-16 10:46:18
真相大白!原来离婚是大S设好的局,现在事态不受控,官方提醒大S

真相大白!原来离婚是大S设好的局,现在事态不受控,官方提醒大S

八卦王者
2024-06-15 21:20:26
姜萍被重点高中家长吐槽:凭啥我儿子做不到,她中专女却能做到?

姜萍被重点高中家长吐槽:凭啥我儿子做不到,她中专女却能做到?

熙熙说教
2024-06-14 17:11:08
回击李晓勇?新疆混血后卫继父:国内混子教练不承认欧美水平更高

回击李晓勇?新疆混血后卫继父:国内混子教练不承认欧美水平更高

大嘴爵爷侃球
2024-06-16 10:55:51
局势大变!中国海警突然清理仁爱礁破船,美国会出手帮菲吗?

局势大变!中国海警突然清理仁爱礁破船,美国会出手帮菲吗?

趣说世界哈
2024-06-13 11:28:23
那些在楼顶转来转去的金属“小帽子”,究竟有何作用?

那些在楼顶转来转去的金属“小帽子”,究竟有何作用?

家装设计指南
2024-06-14 12:45:03
2024-06-16 15:38:47
数码科技八叔
数码科技八叔
分享数码信息,引领时代潮流
100文章数 114253关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

牛弹琴:梅洛尼和马克龙吵了一架 晚宴上眼神可"杀人"

头条要闻

牛弹琴:梅洛尼和马克龙吵了一架 晚宴上眼神可"杀人"

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

游戏
健康
家居
时尚
军事航空

120喜提欧皇,浪漫晋级德国线下

晚餐不吃or吃七分饱,哪种更减肥?

家居要闻

空谷来音 朴素留白的侘寂之美

40岁女人的“优雅范”穿搭,夏天学会这么搭,也能美得很轻松

军事要闻

以军宣布在加沙南部实行"战术暂停"

无障碍浏览 进入关怀版