【PyCaret】使用PyCaret创建机器学习Pipeline进行多分类任务

  发现一个好东西,PyCaret机器学习Pipeline,记录一下用其进行多分类任务的使用方法。


1、简介

  PyCaret是一个开源的、不用写很多代码的Python机器学习库,可以自动化机器学习工作流程,是一个端到端的机器学习和模型管理工具,可以成倍地加快实验周期,提高工作效率。
  PyCaret本质上是几个机器学习库和框架的封装,比如scikit-learn、XGBoost、LightGBM、CatBoost、spaCy、Optuna、Hyperopt、Ray等等。
  一字诗:棒~


2、安装PyCaret

安装命令:

pip install pycaret

安装后测试:

import pycaret
pycaret.__version__
'3.3.0'

3、PyCaret建模

  PyCaret中一个典型的工作流程由以下5个步骤组成:
  Setup ➡️ Compare Models ➡️ Analyze Model ➡️ Prediction ➡️ Save Model

首先,从pycaret数据集模块加载样本数据集(鸢尾花)

from pycaret.datasets import get_data
data = get_data('iris')

非常不幸,在第一步就夭折了…

报错: requests.exceptions.ConnectionError: HTTPSConnectionPool(host=‘raw.githubusercontent.com’, port=443): Max retries exceeded with url: /pycaret/datasets/main/data/common/iris.csv (Caused by NewConnectionError(‘<urllib3.connection.HTTPSConnection object at 0x00000224EF2D0C40>: Failed to establish a new connection: [Errno 11004] getaddrinfo failed’))

原因: https://raw.githubusercontent.com/pycaret/datasets/main/ 这个网址打不开,咋办呢,没有条件创造条件也要上…

解决: 发现 get_data(‘iris’) 加载的数据集应该是如下的 dataframe 形式,一般情况下自己的数据集应该也是这样子的,因此我们把 sklearn.datasets 的鸢尾花数据集重建为 dataframe 形式就可以啦~

在这里插入图片描述

数据集构建代码:

from sklearn.datasets import load_iris
import pandas as pd
target = load_iris().target
target_names = load_iris().target_names
mapping = {'0': target_names[0], '1': target_names[1], '2': target_names[2]}
df_data = pd.DataFrame(load_iris().data, columns=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'])
target_str = pd.DataFrame([mapping[str(num)] for num in target], columns=['species'])
data = pd.concat([df_data, target_str], axis=1)

检查一下数据格式:

在这里插入图片描述

完美,可以继续啦~

3.1 Setup

  Setup函数初始化训练环境并创建transformation pipeline。Setup函数必须在执行PyCaret中的任何其他函数之前调用,只有两个必需的参数,data和target,其他参数均为可选参数。

from pycaret.classification import *
s = setup(data, target = 'species', session_id = 123)

Setup成功执行后,会显示以下实验信息:

在这里插入图片描述

信息说明:
  (1)Session id:随机数种子;
  (2)Target type:自动检测目标类型,二分类、多分类还是回归;
  (3)Target mapping:标签编码,字符串映射为0、1;
  (4)Original data shape:原始数据大小;
  (5)Transformed train set shape:训练集大小;
  (6)Transformed test set shape:测试集大小;
  (7)Numeric features:数字特征的数量;

3.2 Compare Models

  compare_models函数使用交叉验证训练和评估模型库中可用模型的性能,其输出是平均交叉验证分数。

比较基线模型:

best = compare_models()

输出默认按ACC排序:

在这里插入图片描述
打印最优模型:

print(best)

输出为最优模型的参数:

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=1000,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=123, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)

我靠,发没发现,又出问题了,AUC怎么不显示啊啊啊啊啊…学习的路上总是充满坎坷…

调查了一下这个问题,发现这是一个很新的问题,但似乎并没有被解决,大家可以去看看,似乎是我的 PyCaret == 3.3.0 和 scikit-learn==1.4.1.post1 不太匹配的问题:
https://github.com/pycaret/pycaret/pull/3935
https://github.com/pycaret/pycaret/issues/3932

倔强的我,在linux环境中重新配了PyCaret == 3.2.0, scikit-learn==1.0.2,这下可以显示AUC了,舒服了~

在这里插入图片描述

后面哪位朋友解决了3.3.0的AUC不显示问题,记得踢我一下喔~

3.3 Analyze Model

(1)画混淆矩阵

plot_model(best, plot = 'confusion_matrix')

在这里插入图片描述
(2)画AUC曲线

plot_model(best, plot = 'auc')

在这里插入图片描述

这时候AUC又行了…显着你了…估计前面是哪传参数有问题…

(3)画特征重要性

plot_model(best, plot = 'feature')

在这里插入图片描述

3.4 Prediction

  predict_model函数返回 prediction_label 和 prediction_score(预测类的概率)作为数据表中新的列。当data为None(默认)时,它使用测试集(在setup函数期间创建)进行评分。

holdout_pred = predict_model(best)

指标结果:

在这里插入图片描述
返回的dataframe:

在这里插入图片描述

3.5 Save Model

  使用pycaret的save_model函数将整个Pipeline进行保存

save_model(best, 'iris_pipeline')

保存后是一个pkl文件:

在这里插入图片描述

保存后的模型再加载:

loaded_best_pipeline = load_model('iris_pipeline')

4、代码整合

from sklearn.datasets import load_iris
import pandas as pd
from pycaret.classification import *

# 数据集加载
target = load_iris().target
target_names = load_iris().target_names
mapping = {'0': target_names[0], '1': target_names[1], '2': target_names[2]}
df_data = pd.DataFrame(load_iris().data, columns=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'])
target_str = pd.DataFrame([mapping[str(num)] for num in target], columns=['species'])
data = pd.concat([df_data, target_str], axis=1)

# Setup
s = setup(data, target='species', session_id=123)

# Compare Models
best = compare_models()
print(best)

# Analyze Model
plot_model(best, plot = 'confusion_matrix')
plot_model(best, plot = 'auc')
plot_model(best, plot = 'feature')

# Prediction
holdout_pred = predict_model(best)

# Save Model
save_model(best, 'iris_pipeline')

# Load Model
loaded_best_pipeline = load_model('iris_pipeline')

代码是非常简洁明了的,但封装的太好了,有些想改的也不好改了~


参考资料:PyCaret Multiclass Classification Tutorial
更多学习:用PyCaret创建整个机器学习管道
PyCaret的github仓库:https://github.com/pycaret/pycaret/tree/master


最后说一句,PyCaret的Pipeline还是用JupyterLab运行最舒服,Spyter运行不显示,Pycharm运行不好看…

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个使用Scala进行文档分类的示例代码: ```scala import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.NaiveBayes import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer} import org.apache.spark.sql.SparkSession // 创建 SparkSession val spark = SparkSession.builder().appName("DocumentClassification").getOrCreate() // 读取数据 val dataset = spark.read.option("header", "true").option("inferSchema", "true").csv("path/to/dataset.csv") // 数据预处理 val tokenizer = new Tokenizer().setInputCol("text").setOutputCol("words") val hashingTF = new HashingTF().setInputCol(tokenizer.getOutputCol).setOutputCol("rawFeatures").setNumFeatures(10000) val idf = new IDF().setInputCol(hashingTF.getOutputCol).setOutputCol("features") // 划分数据集为训练集和测试集 val splits = dataset.randomSplit(Array(0.8, 0.2), seed = 1234) val trainingData = splits(0) val testData = splits(1) // 使用朴素贝叶斯进行分类 val nb = new NaiveBayes() val pipeline = new Pipeline().setStages(Array(tokenizer, hashingTF, idf, nb)) val model = pipeline.fit(trainingData) // 对测试集进行预测 val predictions = model.transform(testData) // 输出预测结果 predictions.select("label", "prediction", "text").show() // 关闭 SparkSession spark.stop() ``` 在这个示例中,我们使用了Spark的MLlib库来构建一个朴素贝叶斯分类器。首先,我们使用Tokenizer将文本数据分割成单词,然后使用HashingTF将单词特征向量化。接着,我们使用IDF对特征向量进行加权,以减少常见单词的影响。最终,我们将特征向量和标签作为输入,使用朴素贝叶斯进行分类。 ### 回答2: 机器学习对文档数据分类的Scala命令可以通过使用Scala编写的机器学习库来实现。以下是一种可能的方法来分类文档数据: 1. 导入所需的Scala机器学习库,如Apache Spark MLlib。 2. 加载文档数据集,可以使用Spark提供的读取文档的API来加载数据。例如,可以使用`sc.textFile("path_to_documents")`来加载文档数据集。 3. 对文档数据进行预处理,包括分词、移除停用词、提取特征等。可以使用相关的Scala库或自定义方法来实现这些步骤。 4. 将文档数据转换为机器学习算法所需的格式。根据使用的算法不同,可以将文档数据转换为词袋模型、TF-IDF向量等形式。 5. 根据具体需求选择合适的机器学习算法,并使用该算法对文档数据进行训练。例如,可以使用朴素贝叶斯分类器、支持向量机、随机森林等算法。 6. 对训练后的模型进行评估,可以使用交叉验证、准确度、混淆矩阵等指标来评估分类器的性能。 7. 使用训练好的分类器对新的文档数据进行分类预测。可以通过调用分类器的`predict`方法来实现。 8. 可选地,可以对分类结果进行后处理,如过滤低置信度的分类、合并相似的类别等。 9. 最后,保存模型以便将来使用。可以使用Scala的序列化机制将模型保存到磁盘,以便在需要时重新加载并使用。 上述是对机器学习对文档数据分类的Scala命令的一种介绍,具体的实现可能因使用的库和算法不同而有所变化。 ### 回答3: 在Scala中,可以使用Apache Spark来实现机器学习对文档数据的分类。以下是一个示例代码: ```scala import org.apache.spark.ml.feature.{Tokenizer, HashingTF, IDF} import org.apache.spark.ml.classification.{NaiveBayes, NaiveBayesModel} import org.apache.spark.ml.Pipeline import org.apache.spark.sql.SparkSession // 创建SparkSession val spark = SparkSession.builder().appName("Document Classification").getOrCreate() // 加载文档数据 val data = spark.read.format("text").load("/path/to/documents") // 对文档进行分词 val tokenizer = new Tokenizer().setInputCol("value").setOutputCol("words") val wordsData = tokenizer.transform(data) // 将分词后的文档数据转换为特征向量 val hashingTF = new HashingTF().setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(10000) val featurizedData = hashingTF.transform(wordsData) // 计算TF-IDF值 val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features") val idfModel = idf.fit(featurizedData) val rescaledData = idfModel.transform(featurizedData) // 划分训练集和测试集 val Array(trainingData, testData) = rescaledData.randomSplit(Array(0.8, 0.2)) // 创建朴素贝叶斯分类模型 val classifier = new NaiveBayes() .setLabelCol("label") .setFeaturesCol("features") // 创建机器学习流水线 val pipeline = new Pipeline().setStages(Array(tokenizer, hashingTF, idf, classifier)) // 训练模型 val model = pipeline.fit(trainingData) // 对测试集进行预测 val predictions = model.transform(testData) // 输出预测结果 predictions.select("prediction", "label", "features").show() // 保存模型 model.write.overwrite().save("/path/to/model") ``` 在以上代码中,我们首先使用`Tokenizer`对文档进行分词,然后使用`HashingTF`将分词后的文档转换为特征向量。接着,我们使用`IDF`计算TF-IDF值来进一步提取特征。随后,我们使用朴素贝叶斯分类算法进行文档分类,并创建一个机器学习流水线来自动化整个过程。最后,我们将模型保存到指定路径以供以后使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值