どのように優雅にpdpipeとパンダを使用してパイプラインを構築しますか?

作者| Tirthajyotiサルカール

翻訳|クリア子供のお父さん

編集| yugao

制作| AI技術のベースキャンプ(ID:rgznai100) 

REVIEWパンダは、データ分析と機械学習のための偉大なPythonのライブラリの生態系です。世界とScikit学習やTensorFlowそれはエクセル/ CSVファイルと魔法のモデリングの世界の間の完璧なブリッジを表示するように設定SQLのテーブルに存在します。

 

科学的なデータ・ストリームは、通常、一連のステップである:データ収集が洗浄され、彼らは強力な機械学習アルゴリズムによって使用される前に検証をスケーリングする必要があります。

 

もちろん、これらのタスクは、多くの方法によって達成することができ、または単一ステップ関数パッケージのようなパンダを提供するが、よりエレガントな方法は、パイプを使用することです。ほとんどすべての場合において、反復作業を自動化することによって、パイプラインは、エラーの可能性を低くし、時間を節約することができることができます。

科学のデータフィールドでは、特徴的な管路を有するパッケージはR.でScikit-学ぶdplyr生態系やPython言語を持っています

 

機械学習のワークフローでの使用を理解するには、この偉大な記事を読むことができます:

https://www.kdnuggets.com/2017/12/managing-machine-learning-workflows-scikit-learn-pipelines-part-1.html

 

`.Pipe`パンダはまた、この方法は、類似のユーザ定義関数のために使用することができる提供します。しかし、この記事では、我々が議論する、具体的な問題パンダDATAFRAMEパイプラインを扱うpdpipeと呼ばれる偉大な小さなライブラリは、あります。

 

使用パンダパイプライン

 

例Jupyterノートブックは、私のGitHubリポジトリで見つけることができます:

https://github.com/tirthajyoti/Machine-Learning-with-Python/blob/master/Pandas%20and%20Numpy/pdpipe-example.ipynb。

あなたが有益な管路を構築するために、このライブラリを使用している場合を見てみましょう。

 

データセット

 

実証するために、私は、データセットがKaggleからダウンロードすることができ、米国の住宅価格を使用します。

https://www.kaggle.com/vedavyasv/usa-housing

次のように我々は、データセット内のパンダにロードして、集計の表示統計ことができます。

               

しかし、テキストデータを含むデータ・セット「アドレス」フィールドには、そこにあります。

                

修飾子列のサイズを追加します。

 

このデモでは、我々は次のように、コードをコラムハウジングのサイズを定義するデータセットを追加します。

               

このステップの後、データセットは次のよう:

              

最も単純なパイプライン:一回の操作

 

私たちは、最も簡単なパイプラインから起動(ない心配を行い、我々はすぐに複雑に増加します)1つの操作のみが含まれています。

 

私たちはその機械学習チームを想定し、専門家は、彼らは私たちが安全に `平均エリアハウスAge`をモデル化するために使用されるデータを無視することができることを考えて言ってみましょう。したがって、我々は、この列に設定されているデータを削除します。

 

この作業のために、我々は、使用 `ColDrop`のpdpipeは、パイプobject`のdrop_age`を作成することで、データフレームは、このパイプラインに渡されます。



import pdpipe as pdpdrop_age = pdp.ColDrop(‘Avg. Area House Age’)df2 = drop_age(df)


 

予想通り、結果のデータフレームは、次のとおりです。

               

ただ、パイプラインチェーンレベルを追加

 

我々は複数の段階を実行することができた場合にのみ、パイプラインは、便利で実用的です。でpdpipeでこれを実現する方法はいくつかあります。しかし、最も簡単で最も直接的な方法は、+演算子を使用することです。これは、同じマニュアルパイプ接続のようなものです!

 

あなたは簡単にデータセットの分類や回帰アルゴリズムで実行できるように例えば、 `age`列を削除するだけでなく、我々はまた、ワンホットエンコーディングのハウスsize`列to`たいです。



pipeline = pdp.ColDrop(‘Avg. Area House Age’)
pipeline+= pdp.OneHotEncode(‘House_size’)
df3 = pipeline(df)

したがって、我々は最初の `平均using` ColDrop`方法。エリアハウスAge`列を削除するパイプラインオブジェクトを作成します。その後、私たちはパイプラインにオブジェクトに `OneHotEncode`メソッドを追加する一般的なPythonの` `+ =構文を使用します。

 

図に示すように、データフレームが生成しました。示す追加の列が `House_size_Medium` and` House_size_Small`はワンホットエンコーディングによって作成されたことに注意してください。

              

行の値に基づいて、削除行

 

接下来,我们可能希望根据行值来删除它们。具体来说,我们可能希望删除房价低于 25 万的所有数据。我们有 `ApplybyCol` 的方法来讲删除用户蒂尼的函数应用到 DataFrame,还有一个方法 `ValDrop` 根据特定值来删除某些行。我们可以轻松地将这些方法链接到管道,以便能够有选择地删除行(我们仍在向现有的管道对象中添加内容,该对象已经完成了列删除和独热编码的其他工作)。

 



def price_tag(x):    if x>250000:        return 'keep'    else:        return 'drop'pipeline+=pdp.ApplyByCols('Price',price_tag,'Price_tag',drop=False)pipeline+=pdp.ValDrop(['drop'],'Price_tag')pipeline+= pdp.ColDrop('Price_tag')


第一个方法是通过应用用户定义的函数 `price_tag()`,根据 `Price` 列中的值来对行进行标记。

              

第二种方法是,在  `Price_tag` 中查找字符串 `drop`,并删除那些匹配的行。最后,第三个方法就是删除 `Price_tag` 标签列,清理 DataFrame。毕竟,这个 `Price_tag`列只是临时需要的,用于标记特定的行,在达到目的后就应该将其删除。

 

所有这些都是通过简单地链接同一管道上的各个阶段来完成的!

 

现在,我们可以回顾一下,看看我们的管道从一开始对 DataFrame 都做了什么工作:

 

  • 删除特定的列。

  • 独热编码,用于建模的分类数据列。

  • 根据用户定义函数对数据进行标记。

  • 根据标记删除行。

  • 删除临时标记列。

 

所有这些,使用的是以下五行代码:

 



pipeline = pdp.ColDrop('Avg. Area House Age')pipeline+= pdp.OneHotEncode('House_size')pipeline+=pdp.ApplyByCols('Price',price_tag,'Price_tag',drop=False)pipeline+=pdp.ValDrop(['drop'],'Price_tag')pipeline+= pdp.ColDrop('Price_tag')
df5 = pipeline(df)


最近版本更新:直接删除行!

 

我与包作者 Shay Palachy 进行了精彩的讨论,他告诉我,该包的最新版本可以用 lambda 函数,仅用一行代码即可完成行的删除(满足给定的条件),如下所示:

 

pdp.RowDrop({‘Price’: lambda x: x <= 250000})
 

Scikit-learn 与 NLTK

 

还有许多更有用、更直观的 DataFrame 操作方法可用于 DataFrame 操作。但是,我们只是想说明,即使是 Scikit-learn 和 NLTK 包中的一些操作,也包含在 pdpipe 中,用于创建非常出色的管道。

 

Scikit-learn 的缩放估算器

 

建立机器学习模型最常见的任务之一是数据的缩放。Scikit-learn 提供了集中不同类型的缩放,例如,最小最大缩放,或者基于标准化的缩放(其中,数据集的平均值被减去,然后除以标准差)。

 

我们可以在管道中直接链接这些缩放操作。下面的代码段演示了这种用法:

 



pipeline_scale = pdp.Scale('StandardScaler',exclude_columns=['House_size_Medium','House_size_Small'])df6 = pipeline_scale(df5)


本文中,我们应用了 Scikit-learn 包中的 `StandardScaler` 估算器来转换数据以进行聚类或神经网络拟合。我们可以选择性地排除那些无需缩放的列,就像我们在本文中对指示列 `House_size_Medium` 和 `House_size_Small` 所做的那样。

 

瞧!我们得到了缩放后的 DataFrame:

               

NLTK 的词法分析器

 

我们注意到,DataFrame 中的 Address 字段现在几乎毫无用处。但是,如果我们可以从这些字符串中提取邮政编码或州名,它们可能对某种形式的可视化或机器学习任务有用。

 

为此,我们可以使用 Word Tokenizer(单词标记器)来实现这一目的。NTLK 是一个流行而强大的 Python 库,用于文本挖掘和自然语言处理,并提供了一系列的标记器方法。在本文示例中,我们客户使用一个这样的标记器来拆分 Address 字段中的文本,并从中提取州名。我们注意到,州名就是地址字符串中的倒数第二个单词。因此,下面的链式管道就可以帮我们完成这项工作:

 



def extract_state(token):    return str(token[-2])
pipeline_tokenize=pdp.TokenizeWords('Address')pipeline_state = pdp.ApplyByCols('Address',extract_state,result_columns='State')
pipeline_state_extract = pipeline_tokenize + pipeline_state
df7 = pipeline_state_extract(df6


生成的 DataFrame 如下所示:

              

总结

 

如果我们对本文这个演示中显示的所有操作进行总结,则如下所示:

               

所有这些操作都可以在类似类型的数据集上频繁使用,并在数据集准备好进入下一级建模之前,能有一组简单的顺序代码块作为预处理操作来执行,将是非常棒的。

 

流水线是实现统一的顺序代码块集的关键。Pandas 是机器学习和数据科学团队中用于这类数据预处理任务的最广泛使用的 Python 库,而 pdpipe 则提供了一种简单而强大的方法,可以使用 Pandas 类型操作构建管道,可以直接应用于 Pandas DataFrame 对象。

 

你可以自己探索这个库,为你的特定数据科学任务构建更强大的管道。

 

原文链接:

https://towardsdatascience.com/https-medium-com-tirthajyoti-build-pipelines-with-pandas-using-pdpipe-cade6128cd31

(*本文为AI科技大本营翻译文章,转载请微信联系 1092722531)

精彩推荐

2020年,由 CSDN 主办的「Python开发者日」活动(Python Day)正式启动。我们将与 PyCon 官方授权的 PyCon中国社区合作,联手顶尖企业、行业与技术专家,通过精彩的技术干货内容、有趣多元化的活动等诸多体验,共同为中国 IT 技术开发者搭建专业、开放的技术交流与成长的家园。未来,我们和中国万千开发者一起分享技术、践行技术,铸就中国原创技术力量。

【Python Day——北京站】现已正式启动,「新春早鸟票」火热开抢!2020年,我们还将在全国多个城市举办巡回活动,敬请期待!

活动咨询,可扫描下方二维码加入官方交流群~

CSDN「Python Day」咨询群 ????

来~一起聊聊Python

如果群满100人,无法自动进入,可添加会议小助手微信:婷婷,151 0101 4297(电话同微信)


推荐阅读

发布了1307 篇原创文章 · 获赞 1万+ · 访问量 545万+

おすすめ

転載: blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/104079017