本文作者 Favio Vázquez 从 2018 年开始发布《数据科学和人工智能每周文摘: Python & R》系列文章, 为数据科学家介绍最好的库, repos,packages 以及工具.
一年结束, 作者列出了 2018 年的 7 大最好的 Python 库, 这些库确实地改进了研究人员的工作方式.
7. AdaNet--- 快速灵活的 AutoML 框架
https://github.com/tensorflow/adanet
AdaNet 是一个轻量级的, 可扩展的 TensorFlow AutoML 框架, 用于使用 AdaNet 算法训练和部署自适应神经网络 [Cortes et al. ICML 2017].AdaNet 结合了多个学习子网络, 以减轻设计有效的神经网络所固有的复杂性.
这个软件包将帮助你选择最优的神经网络架构, 实现一种自适应算法, 用于学习作为子网络集合的神经架构.
你需要了解 TensorFlow 才能使用这个包, 因为它实现了 TensorFlow Estimator, 但这将通过封装训练, 评估, 预测和导出服务来帮助你简化机器学习编程.
你可以构建一个神经网络的集合, 这个库将帮助你优化一个目标, 以平衡集合在训练集上的性能和将其泛化到未见过数据的能力之间的权衡.
安装
安装 adanet 之前需将 TensorFlow 升级到 1.7 或以上:
$ pip install"tensorflow>=1.7.0"
从源代码安装
要从源代码进行安装, 首先需要安装 bazel.
下一步, 复制 adanet 和 cd 到它的根目录:
$ Git clone https://github.com/tensorflow/adanet && cd adanet
从 adanet 根目录运行测试:
- $ cd adanet
- $ bazel test -c opt //...
确认一切正常后, 将 adanet 安装为 pip 包.
现在, 可以对 adanet 进行试验了.
importadanet
用法
有关 AdaNet 的详细用法, 请阅读官方教程:
- https://github.com/tensorflow/adanet/tree/master/adanet/examples/tutorials
- https://ai.googleblog.com/2018/10/introducing-adanet-fast-and-flexible.html?m=1
6. TPOT-- 一个自动化的 Python 机器学习工具
https://github.com/EpistasisLab/tpot
之前我介绍过 Auto-keras, 这是一个很棒的 AutoML 库. 现在我们有另一个非常有趣的工具 --TPOT.
TPOT 全称是基于树的 pipeline 优化工具 (Tree-based Pipeline Optimization Tool), 这是一个非常棒 Python 自动机器学习工具, 使用遗传编程优化机器学习 pipeline.
TPOT 可以自动化许多东西, 包括生命特性选择, 模型选择, 特性构建等等. 如果你是 Python 机器学习者, 很幸运, TPOT 是构建在 Scikit-learn 之上的, 所以它生成的所有代码看起来应该很熟悉.
它的作用是通过智能地探索数千种可能的 pipeline 来自动化机器学习中最繁琐的部分, 找到最适合你的数据的 pipeline, 然后为你提供最佳的 Python 代码.
它的工作原理如下:
安装
安装 TPOT 之前, 请先阅读教程:
http://epistasislab.github.io/tpot/installing/
然后, 运行以下代码:
pip install tpot
例子:
首先让我们从基本的 Iris 数据集开始:
- fromtpotimportTPOTClassifier
- fromsklearn.datasetsimportload_iris
- fromsklearn.model_selectionimporttrain_test_split
- # Load iris dataset
- iris = load_iris()
- # Split the data
- X_trainX_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,
- train_size=0.75, test_size=0.25)
- # Fit the TPOT classifier
- tpot = TPOTClassifier(verbosity=2, max_time_mins=2)
- tpot.fit(X_train, y_train)
- # Export the pipeline
- tpot.export('tpot_iris_pipeline.py')
我们在这里构建了一个非常基本的 TPOT pipeline, 它将尝试寻找最佳 ML pipeline 来预测 iris.target. 然后保存这个 pipeline. 之后, 我们要做的就非常简单了 -- 加载生成的. py 文件, 你将看到:
- importnumpyasnp
- fromsklearn.kernel_approximationimportRBFSampler
- fromsklearn.model_selectionimporttrain_test_split
- fromsklearn.pipelineimportmake_pipeline
- fromsklearn.treeimportDecisionTreeClassifier
- #NOTE:Make sure that the class is labeled 'class' in the data file
- tpot_data = np.recfromcsv('PATH/TO/DATA/FILE', delimiter='COLUMN_SEPARATOR', dtype=np.float64)
- features = np.delete(tpot_data.view(np.float64).reshape(tpot_data.size,-1), tpot_data.dtype.names.index('class'), axis=1)
- training_features, testing_features, training_classes, testing_classes = \
- train_test_split(features, tpot_data['class'], random_state=42)
- exported_pipeline = make_pipeline(
- RBFSampler(gamma=0.8500000000000001),
- DecisionTreeClassifier(criterion="entropy", max_depth=3, min_samples_leaf=4, min_samples_split=9)
- )
- exported_pipeline.fit(training_features, training_classes)
- results = exported_pipeline.predict(testing_features)
就是这样. 你已经以一种简单但强大的方式为 Iris 数据集构建一个分类器.
现在我们来看看 MNIST 的数据集:
- fromtpotimportTPOTClassifier
- fromsklearn.datasetsimportload_digits
- fromsklearn.model_selectionimporttrain_test_split
- # load and split dataset
- digitsdigits == load_digitsload_di ()
- X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target,
- train_size=0.75, test_size=0.25)
- # Fit the TPOT classifier
- tpot = TPOTClassifier(verbosity=2, max_time_mins=5, population_size=40)
- tpot.fit(X_train, y_train)
- # Export pipeline
- tpot.export('tpot_mnist_pipeline.py')
接下来我们再次加载生成的 .py 文件, 你将看到:
- importnumpyasnp
- fromsklearn.model_selectionimporttrain_test_split
- fromsklearn.neighborsimportKNeighborsClassifier
- #NOTE:Make sure that the class is labeled 'class' in the data file
- tpot_data = np.recfromcsv('PATH/TO/DATA/FILE', delimiter='COLUMN_SEPARATOR', dtype=np.float64)
- features = np.delete(tpot_data.view(np.float64).reshape(tpot_data.size,-1), tpot_data.dtype.names.index('class'), axis=1)
- training_features, testing_features, training_classes, testing_classes = \
- train_test_split(features, tpot_data['class'], random_state=42)
- exported_pipeline = KNeighborsClassifier(n_neighbors=4, p=2, weights="distance")
- exported_pipeline.fit(training_features, training_classes)
- results = exported_pipeline.predict(testing_features)
5. SHAP-- 一个解释任何机器模型输出的统一方法
https://github.com/slundberg/shap
解释机器学习模型并不容易. 然而, 它对许多商业应用程序来说非常重要. 幸运的是, 有一些很棒的库可以帮助我们完成这项任务. 在许多应用程序中, 我们需要知道, 理解或证明输入变量在模型中的运作方式, 以及它们如何影响最终的模型预测.
SHAP (SHapley Additive exPlanations) 是一种解释任何机器学习模型输出的统一方法. SHAP 将博弈论与局部解释联系起来, 并结合了之前的几种方法.
安装
SHAP 可以从 PyPI 安装
pip install shap
或 conda -forge
conda install -c conda-forge shap
用法
有很多不同的模型和方法可以使用这个包. 在这里, 我将以 DeepExplainer 中的一个例子为例.
Deep SHAP 是深度学习模型中 SHAP 值的一种高速近似算法, 它基于与 DeepLIFT 的连接, 如 SHAP 的 NIPS 论文所述 (https://arxiv.org/abs/1802.03888).
下面这个例子可以看到 SHAP 如何被用来解释 MNIST 数据集的 Keras 模型结果:
- # this is the code from https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py
- from__future__importprint_function
- importkeras
- fromkeras.datasetsimportmnist
- fromkeras.modelsimportSequential
- fromkeras.layersimportDense, Dropout, Flatten
- fromkeras.layersimportConv2D, MaxPooling2D
- fromkerasimportbackendasK
- batch_size =128
- num_classes =10
- epochs =12
- # input image dimensions
- img_rows, img_cols =28,28
- # the data, split between train and test sets
- (x_train, y_train), (x_test, y_test) = mnist.load_data()
- ifK.image_data_format() =='channels_first':
- x_train = x_train.reshape(x_train.shape[0],1, img_rows, img_cols)
- x_test = x_test.reshape(x_test.shape[0],1, img_rows, img_cols)
- input_shape = (1, img_rows, img_cols)
- else:
- x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols,1)
- x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols,1)
- input_shape = (img_rows, img_cols,1)
- x_train = x_train.astype('float32')
- x_test = x_test.astype('float32')
- x_train /=255
- x_test /=255
- print('x_train shape:', x_train.shape)
- print(x_train.shape[0],'train samples')
- print(x_test.shape[0],'test samples')
- # convert class vectors to binary class matrices
- y_train = keras.utils.to_categorical(y_train, num_classes)
- y_test = keras.utils.to_categorical(y_test, num_classes)
- model = Sequential()
- model.add(Conv2D(32, kernel_size=(3,3),
- activation='relu',
- input_shape=input_shape))
- model.add(Conv2D(64, (3,3), activation='relu'))
- model.add(MaxPooling2D(pool_size=(2,2)))
- model.add(Dropout(0.25))
- model.add(Flatten())
- model.add(Dense(128, activation='relu'))
- model.add(Dropout(0.5))
- model.add(Dense(num_classes, activation='softmax'))
- model.compile(loss=keras.losses.categorical_crossentropy,
- optimizer=keras.optimizers.Adadelta(),
- metrics=['accuracy'])
- model.fit(x_train, y_train,
- batch_size=batch_size,
- epochs=epochs,
- verbose=1,
- validation_data=(x_test, y_test))
- score = model.evaluate(x_test, y_test, verbose=0)
- print('Test loss:', score[0])
- print('Test accuracy:', score[1])
更多示例:
https://github.com/slundberg/shap#sample-notebooks
4. Optimus-- 使用 Python 和 Spark 轻松实现敏捷数据科学工作流
https://github.com/ironmussa/Optimus
Optimus V2 旨在让数据清理更容易. 这个 API 的设计对新手来说超级简单, 对使用 pandas 的人来说也非常熟悉. Optimus 扩展了 Spark DataFrame 功能, 添加了. rows 和. cols 属性.
使用 Optimus, 你可以以分布式的方式清理数据, 准备数据, 分析数据, 创建分析器和图表, 并执行机器学习和深度学习, 因为它的后端有 Spark,TensorFlow 和 Keras.
Optimus 是数据科学敏捷方法的完美工具, 因为它几乎可以帮助你完成整个过程的所有步骤, 并且可以轻松地连接到其他库和工具.
- Installation (pip):
- pip install optimuspyspark
用法
在这个示例中, 你可以从 URL 加载数据, 对其进行转换, 并应用一些预定义的清理功能:
- fromoptimusimportOptimus
- op = Optimus()
- # This is a custom function
- deffunc(value, arg):
- return"this was a number"
- df =op.load.url("https://raw.githubusercontent.com/ironmussa/Optimus/master/examples/foo.csv")
- df\
- .rows.sort("product","desc")\
- .cols.lower(["firstName","lastName"])\
- .cols.date_transform("birth","new_date","yyyy/MM/dd","dd-MM-YYYY")\
- .cols.years_between("birth","years_between","yyyy/MM/dd")\
- .cols.remove_accents("lastName")\
- .cols.remove_special_chars("lastName")\
- .cols.replace("product","taaaccoo","taco")\
- .cols.replace("product",["piza","pizzza"],"pizza")\
- .rows.drop(df["id"]<7)\
- .cols.drop("dummyCol")\
- .cols.rename(str.lower)\
- .cols.apply_by_dtypes("product",func,"string", data_type="integer")\
- .cols.trim("*")\
- .show()
你可以将这个表格
转换为这样:
是不是很酷? 这个库还可以做更多事情, 具体请阅读:
https://www.hioptimus.com/
3. spacy-- 使用 Python 和 Cython 的工业级自然语言处理
https://spacy.io/
spaCy 旨在帮助你完成实际的工作 -- 构建真实的产品, 或收集真实的见解. 这个库尊重你的时间, 尽量避免浪费. 它易于安装, 而且它的 API 简单而高效. spaCy 被视为自然语言处理的 Ruby on Rails.
spaCy 是为深度学习准备文本的最佳方法. 它与 TensorFlow,PyTorch,Scikit-learn,Gensim 以及 Python 强大的 AI 生态系统的其他部分无缝交互. 使用 spaCy, 你可以很容易地为各种 NLP 问题构建语言复杂的统计模型.
安装
- pip3 install spacy
- $ python3 -m spacy download en
这里, 我们还下载了英语语言模型. 你可以在这里找到德语, 西班牙语, 意大利语, 葡萄牙语, 法国语等版本的模型:
https://spacy.io/models/
下面是主页面的一个示例:
- # python -m spacy download en_core_web_sm
- importspacy
- # Load English tokenizer, tagger, parser, NER and Word vectors
- nlp = spacy.load('en_core_web_sm')
- # Process whole documents
- text = (u"When Sebastian Thrun started working on self-driving cars at"
- u"Google in 2007, few people outside of the company took him"
- u"seriously."I can tell you very senior CEOs of major American "u"car companies would shake my hand and turn away because I wasn't"
- u"worth talking to," said Thrun, now the co-founder and CEO of "u"online higher education startup Udacity, in an interview with "u"Recode earlier this week.")
- doc = nlp(text)
- # Find named entities, phrases and concepts
- forentityindoc.ents:
- print(entity.text, entity.label_)
- # Determine semantic similarities
- doc1 = nlp(u"my fries were super gross")
- doc2 = nlp(u"such disgusting fries")
- similarity = doc1.similarity(doc2)
- print(doc1.text, doc2.text, similarity)
在这个示例中, 我们首先下载 English tokenizer, tagger, parser, NER 和 Word vectors. 然后创建一些文本, 打印找到的实体, 短语和概念, 最后确定两个短语的语义相似性. 运行这段代码, 你会得到:
- Sebastian Thrun PERSON
- Google ORG
- 2007DATE
- American NORP
- Thrun PERSON
- Recode ORG
- earlier this week DATE
- my fries were super gross such disgusting fries0.7139701635071919
- 2. jupytext
对我来说, jupytext 是年度最佳. 几乎所有人都在像 Jupyter 这样的笔记本上工作, 但是我们也在项目的更核心部分使用像 PyCharm 这样的 IDE.
好消息是, 你可以在自己喜欢的 IDE 中起草和测试普通脚本, 在使用 Jupytext 时可以将 IDE 作为 notebook 在 Jupyter 中打开. 在 Jupyter 中运行 notebook 以生成输出, 关联. ipynb 表示, 并作为普通脚本或传统 Jupyter notebook 进行保存和分享.
下图展示了这个包的作用:
可点击下方链接查看原文中的 GIF 展示:
https://heartbeat.fritz.ai/top-7-libraries-and-packages-of-the-year-for-data-science-and-ai-python-r-6b7cca2bf000
安装
pip install jupytext --upgrade
然后, 配置 Jupyter 使用 Jupytext:
使用 jupyter notebook --generate-config 生成 Jupyter 配置
编辑. jupyter/jupyter_notebook_config.py, 并附加以下代码:
c.NotebookApp.contents_manager_class ="jupytext.TextFileContentsManager"
重启 Jupyter, 即运行:
jupyter notebook
你可以在这里试试:
https://mybinder.org/v2/gh/mwouts/jupytext/master?filepath=demo
1.Chartify-- 让数据科学家很容易创建图表的 Python 库
https://xkcd.com/1945/
Chartify 是 Python 的年度最佳库.
在 Python 世界中创建一个像样的图很费时间. 幸运的是, 我们有像 Seaborn 之类的库, 但问题是他们的 plots 不是动态的.
然后就出现了 Bokeh-- 这是一个超棒的库, 但用它来创造互动情节仍很痛苦.
Chartify 建立在 Bokeh 之上, 但它简单得多.
Chartify 的特性:
一致的输入数据格式: 转换数据所需的时间更少. 所有绘图函数都使用一致, 整洁的输入数据格式.
智能默认样式: 创建漂亮的图表, 几乎不需要自定义.
简单 API:API 尽可能直观和容易学习.
灵活性: Chartify 是建立在 Bokeh 之上的, 所以如果你需要更多的控制, 你可以使用 Bokeh 的 API.
安装
Chartify 可以通过 pip 安装:
pip3 install chartify
用法
假设我们想要创建这个图表:
- importpandasaspd
- importchartify
- # Generate example data
- data = chartify.examples.example_data()
现在, 我们已经加载了一些示例数据, 让我们来做一些转换:
- total_quantity_by_month_and_fruit = (data.groupby(
- [data['date'] + pd.offsets.MonthBegin(-1),'fruit'])['quantity'].sum()
- .reset_index().rename(columns={
- 'date':'month'
- })
- .sort_values('month'))
- print(total_quantity_by_month_and_fruit.head())
- month fruit quantity
- 02017-01-01Apple7
- 12017-01-01Banana6
- 22017-01-01Grape1
- 32017-01-01Orange2
- 42017-02-01Apple8
现在我们可以把它画出来:
- # Plot the data
- ch = chartify.Chart(blank_labels=True, x_axis_type='datetime')
- ch.set_title("Stacked area")
- ch.set_subtitle("Represent changes in distribution.")
- ch.plot.area(
- data_frame=total_quantity_by_month_and_fruit,
- x_column='month',
- y_column='quantity',
- color_column='fruit',
- stacked=True)
- ch.show('png')
超级容易创建一个互动的 plot.
更多示例:
https://github.com/spotify/chartify
来源: http://www.jianshu.com/p/8a2e789be788