什么是 Scikit-learn?
Scikit-learn 是一个基于 Python 的免费机器学习库,最初由 David Cournapeau 作为 Google Summer of Code 项目开发,2010 年首次公开发布。它建立在 NumPy、SciPy 和 matplotlib 之上,提供分类、回归、聚类、降维、模型选择和数据预处理等核心功能。官方网址为 scikit-learn.org,文档完善,社区活跃,是数据科学领域最常用的工具之一。
如何安装 Scikit-learn?
推荐使用 pip 或 conda 安装。在终端执行 pip install -U scikit-learn 即可获取最新稳定版。若使用 Anaconda 发行版,运行 conda install -c conda-forge scikit-learn。安装前请确保 Python 版本为 3.8 或更高。安装完成后,可通过 python -c "import sklearn; print(sklearn.__version__)" 验证版本。
Scikit-learn 支持哪些监督学习算法?
分类方面包括支持向量机(SVM)、K 近邻、决策树、随机森林、梯度提升、逻辑回归、朴素贝叶斯等。回归方面涵盖线性回归、岭回归、Lasso、弹性网络、决策树回归、随机森林回归、SVR(支持向量回归)等。所有算法均遵循统一的 API 设计,便于快速替换和对比。
Scikit-learn 支持哪些无监督学习算法?
聚类算法有 K-Means、DBSCAN、层次聚类(AgglomerativeClustering)、高斯混合模型(GMM)等。降维算法包括主成分分析(PCA)、核 PCA、t-SNE、截断 SVD、因子分析、独立成分分析(ICA)等。异常检测方面提供 IsolationForest、LocalOutlierFactor、OneClassSVM 等。
如何准备用于 Scikit-learn 的数据?
数据通常以二维数组或 DataFrame 形式输入,特征矩阵应为数值型,缺失值需提前处理。Scikit-learn 提供了 preprocessing 模块,包括 StandardScaler 标准化、MinMaxScaler 归一化、OneHotEncoder 独热编码、LabelEncoder 标签编码等。分类任务的标签也需为数值型。建议使用 train_test_split 将数据分为训练集和测试集。
什么是估计器(Estimator)?Scikit-learn 的 API 是如何设计的?
所有模型对象在 Scikit-learn 中都被称为“估计器”,统一继承自 BaseEstimator。核心方法包括 fit(X, y) 用于训练模型,predict(X) 用于预测,score(X, y) 用于评估。转换器(如预处理类)则提供 fit_transform 方法。这种一致性设计极大降低了学习成本,用户只需熟悉一个接口即可操作数十种算法。
如何评估模型的性能?Scikit-learn 提供哪些指标?
metrics 模块包含丰富的评分函数:分类任务可用 accuracy_score、precision_score、recall_score、f1_score、roc_auc_score 等;回归任务可用 mean_squared_error、mean_absolute_error、r2_score;聚类可用 silhouette_score、adjusted_rand_score。同时支持交叉验证通过 cross_val_score 获取更稳定的性能估计。
如何调参(超参数优化)?
Scikit-learn 提供 GridSearchCV 和 RandomizedSearchCV 进行自动化超参数搜索。通过定义参数网格或分布,结合交叉验证,自动寻找最佳参数组合。例如 GridSearchCV(estimator, param_grid, cv=5)。此外,HalvingGridSearchCV 采用渐近式搜索,在大数据集上效率更高。
什么是 Pipeline?如何使用?
Pipeline 用于将多个转换步骤和最终估计器串联成一个整体。例如:Pipeline([('scaler', StandardScaler()),('svm', SVC())])。这样做的好处是避免数据泄露,确保交叉验证时每一步都正确执行。Pipeline 本身也是一个估计器,可直接 fit 和 predict,并与 GridSearchCV 无缝配合。
Scikit-learn 如何处理类别特征?
Scikit-learn 的多数算法要求输入为数值。类别特征应通过 OneHotEncoder 或 OrdinalEncoder 转换。前者生成独热向量,后者按顺序映射为整数。注意决策树和随机森林等树模型理论上可直接处理类别,但 Scikit-learn 实现仍要求数值编码。对于高基数类别特征,建议先进行目标编码或使用 FeatureHasher。
如何保存和加载训练好的模型?
推荐使用 Python 内置的 pickle 模块或 joblib(Scikit-learn 官方建议)。其中 joblib.dump(model, 'model.pkl') 和 joblib.load('model.pkl') 在大型 NumPy 数组处理上更高效。也可使用 cloudpickle 等扩展。注意模型文件可能包含训练数据细节,部署时需考虑安全性和版本兼容性。
Scikit-learn 内置了哪些示例数据集?
datasets 模块提供多个经典数据集:鸢尾花(iris)、波士顿房价(boston,已移除但可通过 load_diabetes 替代)、手写数字(digits)、葡萄酒(wine)、乳腺癌(breast_cancer)等。此外还有 make_classification、make_regression 等生成函数,用于创建模拟数据。
Scikit-learn 是否支持 GPU 加速?
原生 Scikit-learn 不直接支持 GPU,所有计算在 CPU 上完成。对于大规模数据集,建议结合其他 GPU 框架(如 cuML、XGBoost GPU 版本)或使用 Scikit-learn 的并行化选项(通过 n_jobs 参数调用多核)。不过最新版已开始集成 Intel 的 daal4py 后端以加速部分算法,但 GPU 支持仍非正式特性。
为什么 Scikit-learn 的 predict 方法有时返回概率而不是类别?
部分分类器(如逻辑回归、SVM 设置 probability=True、随机森林)支持 predict_proba 方法,返回每个类别的概率估计。而 predict 默认返回硬分类结果。如需概率,请调用 model.predict_proba(X)。注意 SVM 的 probability=True 会降低训练速度,因为需要额外的 Platt 缩放。
如何处理缺失值?
Scikit-learn 的多数算法不接受 NaN 值。必须预先处理。可使用 SimpleImputer 用均值、中位数、众数或常数填充;也可使用 KNNImputer 基于近邻填充。对于时间序列数据,IterativeImputer 模拟链式方程。注意树模型(如随机森林)自身可以处理缺失值,但 Scikit-learn 的实现仍依赖外部填充,而第三方库如 XGBoost 内置缺失值处理。
什么是特征重要性?如何获取?
树模型(决策树、随机森林、梯度提升)训练后可通过 model.feature_importances_ 获取基于不纯度减少的特征重要性分数。线性模型可通过 model.coef_ 系数绝对值判断特征影响。此外,permutation_importance 函数可对任意估计器计算置换重要性,不限于树模型。
Scikit-learn 如何处理多标签分类?
对于每个样本可能属于多个类别的问题,Scikit-learn 提供 MultiOutputClassifier 包装器,将任意单标签分类器扩展为多标签版本。也可直接使用支持多标签的算法如 DecisionTreeClassifier、KNeighborsClassifier(通过 metric 参数)或 RandomForestClassifier。标签需以二进制矩阵形式提供(形状 [n_samples, n_labels])。
如何在新版本中迁移已有代码?
Scikit-learn 遵循语义化版本,主要版本(如 1.0 到 1.1)可能包含破坏性变更。官方文档提供迁移指南,并在 sklearn.exceptions 中标记弃用警告。建议定期查看 whats_new 页面。常见的变更包括:某些算法参数重命名、默认值调整、或数据集被移除。使用 sklearn.utils.estimator_html_repr 可辅助调试。
Scikit-learn 与 pandas 如何结合使用?
直接传入 pandas DataFrame 或 Series 作为特征矩阵和标签,Scikit-learn 会自动识别列名和索引。但需注意:某些估计器在 sklearn 0.24 之后才完全支持 DataFrame 索引对齐。推荐用 ColumnTransformer 对不同类型的列应用不同预处理(如数值列标准化、类别列独热编码),配合 Pipeline 构建完整工作流。
为什么训练时出现 “ValueError: Found input variables with inconsistent numbers of samples”?
此错误通常因特征矩阵 X 与标签 y 的行数不一致,或 X 各样本长度不同。请检查 X 的形状为 (n_samples, n_features),y 的形状为 (n_samples,) 或 (n_samples, n_outputs)。使用 np.reshape 或 pd.DataFrame 确保维度匹配。若使用数组切片,注意避免维度塌缩。
如何并行化训练过程?
许多估计器支持 n_jobs 参数,设置为 -1 表示使用所有 CPU 核心。例如 RandomForestClassifier(n_jobs=-1)。对于网格搜索或交叉验证,GridSearchCV 也支持 n_jobs 并行搜索。注意在虚拟环境或容器内,joblib 的并行后端可能需要调整(如设置 prefer="threads" 避免内存暴增)。
Scikit-learn 有官方的机器学习算法比较图吗?
官方文档提供“Choosing the right estimator”流程图(位于首页和用户指南中),按问题类型(分类、回归、聚类等)和数据规模引导用户选择合适算法。此外,scikit-learn.org/stable/tutorial/machine_learning_map/ 有交互式地图。该图基于数据特征(小于 100K 样本、非稀疏、类别问题等)推荐起始模型。