【DSW Gallery】SkLearn CookBook

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 本文以KNN模型为例子,介绍了如何使用sklearn中的方法进行模型的训练,超参数的自动化调优以及如何对数据进行降维等等。

直接使用

请打开SkLearn CookBook,并点击右上角 “ 在DSW中打开” 。

image.png

sklearn CookBook

本文主要介绍sklearn的一些基本技巧,主要包括以下几方面:

1. sklearn在机器学习中的一些主要应用:
   1. 监督学习/非监督血虚
   2. 如何使用sklearn进行自动化的超参数调优
   3. 如何使用sklearn创建pipeline,让我们的机器学习代码更加简洁高效

1.1 使用sklearn进行监督学习的建模

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
df = pd.read_csv('diabetes.csv')
df.head()
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
X = df.drop('Outcome',axis=1).values
y = df['Outcome'].values
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state=42, stratify=y)
from sklearn.neighbors import KNeighborsClassifier
neighbors = np.arange(1,9)
train_accuracy =np.empty(len(neighbors))
test_accuracy = np.empty(len(neighbors))
for i,k in enumerate(neighbors):
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train, y_train)
    train_accuracy[i] = knn.score(X_train, y_train)

基于不同的k,打印k的值和模型精度的关系曲线,我们发现k=7的时候,精度最高

plt.title('k-NN Varying number of neighbors')
plt.plot(neighbors, test_accuracy, label='Testing Accuracy')
plt.plot(neighbors, train_accuracy, label='Training accuracy')
plt.legend()
plt.xlabel('Number of neighbors')
plt.ylabel('Accuracy')
plt.show()   

15-1.png

手动计算一下k=7的时候,分类模型的精度

knn = KNeighborsClassifier(n_neighbors=7)
knn.fit(X_train,y_train)
knn.score(X_test,y_test)
0.7305194805194806

计算一下此时的混淆矩阵

  1. 使用sklearn提供的方法
from sklearn.metrics import confusion_matrix
y_pred = knn.predict(X_test)
confusion_matrix(y_test,y_pred)
array([[165,  36],
       [ 47,  60]])

15-2.png

  1. 使用pandas的crosstab方法
pd.crosstab(y_test, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)
Predicted 0 1 All
TRUE
0 165 36 201
1 47 60 107
All 212 96 308


  1. sklearn中还提供了一种很好的api classification_report

classification_report可以帮助用户自动计算出分类问题中常用的几个metrics的值,包括precision/recall, f1 score

from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred))
     precision    recall  f1-score   support
           0       0.78      0.82      0.80       201
           1       0.62      0.56      0.59       107
    accuracy                           0.73       308
   macro avg       0.70      0.69      0.70       308
weighted avg       0.73      0.73      0.73       308
  1. ROC

ROC、AUC可以排除由于训练样本中的类别不均衡导致的我们最后对模型进行评估的时候的影响

from sklearn.metrics import roc_curve
y_pred_proba = knn.predict_proba(X_test)[:,1]
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
plt.plot([0,1],[0,1],'k--')
plt.plot(fpr,tpr, label='Knn')
plt.xlabel('fpr')
plt.ylabel('tpr')
plt.title('Knn(n_neighbors=7) ROC curve')
plt.show()

15-3.png

from sklearn.metrics import roc_auc_score
roc_auc_score(y_test,y_pred_proba)
0.7345050448691124

1.2 使用sklearn进行超参数调优

  • GridSearch
  • 本例子中,只有一个参数n_neighbors,也就是我们预定义的要分多少类。
  • 实际使用中,如果参数较多,组合较多,这种方式可能会很慢
from sklearn.model_selection import GridSearchCV
param_grid = {'n_neighbors':np.arange(1,50)}
knn = KNeighborsClassifier()
knn_cv= GridSearchCV(knn,param_grid,cv=5)
knn_cv.fit(X,y)
GridSearchCV(cv=5, estimator=KNeighborsClassifier(),
             param_grid={'n_neighbors': array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
       35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])})
knn_cv.best_score_
0.7578558696205755
knn_cv.best_params_
{'n_neighbors': 14}

从上面的例子中可以看出,k=14的时候,当前的KNN算法可以在当前的数据集取得最好的分类效果

1.3 使用pipeline

  • 可以使用sklearn提供的pipeline功能将一些顺序执行的模块串起来,这样代码可以更加简洁
  • 本例中,将会使用pipeline实现下面的事情
  1. 数据标准化(scaler)
  2. 数据降维(PCA)
  3. 训练逻辑回归模型
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn import datasets
pca = PCA()
scaler = StandardScaler()
logistic = LogisticRegression(max_iter=10000, tol=0.1)
pipe = Pipeline(steps=[("scaler", scaler), ("pca", pca), ("logistic", logistic)])
X_digits, y_digits = datasets.load_digits(return_X_y=True)
param_grid = {
    "pca__n_components": [5, 15, 20,25,30,50,55, 60],
    "logistic__C": np.logspace(-4, 4, 8),
}
search = GridSearchCV(pipe, param_grid, n_jobs=2)
search.fit(X_digits, y_digits)
print("Best parameter (CV score=%0.3f):" % search.best_score_)
print(search.best_params_)
pca.fit(X_digits)
fig, (ax0, ax1) = plt.subplots(nrows=2, sharex=True, figsize=(12, 12))
ax0.plot(
    np.arange(1, pca.n_components_ + 1), pca.explained_variance_ratio_, "+", linewidth=2
)
ax0.set_ylabel("PCA explained variance ratio")
ax1.plot(
    np.arange(1, pca.n_components_ + 1), search.cv_results_["mean_test_score"], "*", linewidth=2
)
ax1.set_ylabel("Classification Accuracy")
ax0.axvline(
    search.best_estimator_.named_steps["pca"].n_components,
    linestyle=":",
    label="n_components chosen",
)
ax1.axvline(
    search.best_estimator_.named_steps["pca"].n_components,
    linestyle=":",
    label="n_components chosen",
)
Best parameter (CV score=0.925):
{'logistic__C': 0.2682695795279725, 'pca__n_components': 55}
<matplotlib.lines.Line2D at 0x7fdfe5e612b0>

16-1.png

从上面的图中可以知道,在n_components=55也就是降维到55维度的时候,分类的效果最好

其他

1. sklearn还提供了一系列用于文本处理的工具包和transformer。基于这些工具可以方便的对文本数据进行encoding,分类
2. sklearn提供了一系列基本的统计学算法模型的API,可以很方便的直接去引用。比如XGBoost,naive_bayes,SVM等等
相关实践学习
使用PAI+LLaMA Factory微调Qwen2-VL模型,搭建文旅领域知识问答机器人
使用PAI和LLaMA Factory框架,基于全参方法微调 Qwen2-VL模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
数据可视化 算法 JavaScript
【Python数据挖掘】数据可视化及数据对象的相似性度量算法详解(超详细 附源码)
【Python数据挖掘】数据可视化及数据对象的相似性度量算法详解(超详细 附源码)
511 0
|
8月前
|
数据采集 存储 关系型数据库
数据采集:从何开始?
数据采集:从何开始?
250 65
|
11月前
|
关系型数据库 分布式数据库 数据库
PolarDB 以其出色的性能和可扩展性,成为大数据分析的重要工具
在数字化时代,企业面对海量数据的挑战,PolarDB 以其出色的性能和可扩展性,成为大数据分析的重要工具。它不仅支持高速数据读写,还通过数据分区、索引优化等策略提升分析效率,适用于电商、金融等多个行业,助力企业精准决策。
248 4
|
11月前
|
算法 安全 网络安全
等保、密评使用的IP地址https证书
等保和密评是确保网络安全的重要环节。IP地址的HTTPS证书通过加密数据传输、符合等保密评要求、提升IP身份辨识度,起到关键作用。证书需国产化、支持国密算法,并建议采用OV或EV证书。申请流程包括准备、选择服务商、申请与验证、签发与部署、验证与测试。定期检查证书有效期,确保持续有效性。
|
12月前
|
存储 运维 API
源码解密协程队列和线程队列的实现原理(一)
源码解密协程队列和线程队列的实现原理(一)
192 1
|
SQL 存储 数据库连接
C#编程与数据库交互的实现
【4月更文挑战第20天】C#与数据库交互是现代软件开发的关键,涉及数据库连接、数据操作和访问方式。使用ADO.NET建立连接,执行SQL实现读取、插入、更新和删除数据。可通过直接SQL或数据访问对象进行操作。注意性能优化,使用连接池,处理异常,确保安全,以提升应用性能和稳定性。
188 0
|
11月前
|
监控 前端开发 JavaScript
前端技术探索:构建高效、可维护的Web应用
【10月更文挑战第23天】前端技术探索:构建高效、可维护的Web应用
200 0
|
存储 缓存 安全
深入理解Linux虚拟内存管理(一)2
深入理解Linux虚拟内存管理(一)
221 2
点击富文本部分文字跳转功能
点击富文本部分文字跳转功能
217 0
|
弹性计算 Cloud Native 数据可视化
99元建站+云服务器?我们认真的!
「云·原生建站 」+「云服务器ECS e实例」套餐低至0.2折,仅需99元/首年!复制链接直达购买页:https://market.aliyun.com/xinxuan/pinpai1
1282 0
99元建站+云服务器?我们认真的!

热门文章

最新文章