感谢您的订阅!
您的支持是我持续创作的动力!
在开发机器学习算法的过程中,通常需要经历多个步骤。现在有一种更高效的方法,可以将这些步骤串联起来,这就是“管道”。
管道的主要优势在于简化了步骤,提高了算法的效率。此外,它还有另一个重要优点,我们将在后续部分介绍。
在引入管道前,让我们回顾一下构建算法模型的一般流程。假设我们使用支持向量机(SVM)来建立模型:
虽然这一流程看起来完整,但其中隐藏着一个小错误。您发现了吗?
在对训练集进行预处理时,我们使用了整个训练集的数据。而在进行交叉验证时,我们将一部分训练集用作验证集。由于数据缩放是在交叉验证之前进行的,因此验证集中的数据同样也被缩放了。这就意味着模型在拟合过程中已经获得了部分数据的信息,而非完全全新的数据,从而可能导致过拟合,使模型精度被高估。
解决这个问题的方法很简单:将交叉验证放在数据预处理之前。具体来说,就是在外层循环中执行交叉验证,内层循环中进行数据预处理。这样,只有交叉验证中的训练集会被缩放,验证集不会受到影响。
在scikit-learn中,可以通过Pipeline实现这一目标。
首先,我们需要导入必要的工具:
python
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVC
接着,创建管道:
python
pipeline = Pipeline([('scale', MinMaxScaler()), ('svc', SVC())])
这样,我们就将数据预处理工具和SVC模型连接在一起。其中,“scale”和“svc”是我们自定义的名称。
我们还可以使用管道对数据进行拟合,并观察其精度。这里以乳腺癌数据集为例:
python
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target)
pipeline.fit(X_train, y_train)
pipeline.score(X_test, y_test)
结果显示,模型的精度约为95.8%。
管道的另一个优点是可以应用于网格搜索。这样,我们就能解决之前提到的问题。
在实际应用中,与之前的流程相比没有太大的区别。需要注意的是,在向GridSearchCV传递需要调整的参数时,要指定模型的名称。这个名称就是我们之前自定义的名称。
例如,如果我们需要调整SVC模型的参数C和gamma,并将其命名为“svc”,则需在参数中写成“svcC”和“svcgamma”。
除了使用Pipeline创建管道外,还有一种更简便的方法——make_pipeline。这种方法不需要为每个工具或模型命名,系统会自动为其命名,名称即为工具或模型的英文小写形式。
例如:
python
from sklearn.pipeline import make_pipeline
new_pipeline = make_pipeline(MinMaxScaler(), SVC())
这样,只需直接传入数据预处理工具和模型即可,系统会自动命名。
当然,我们也可以查看具体的步骤或参数:
python
new_pipeline.steps
如果需要查询特定步骤或参数,可以使用named_steps属性:
python
new_pipeline.named_steps['svc'].C
这就是今天的内容,感谢您的阅读和支持!