目录
简介
第一章:Sklearn简介
Sklearn的特点与优势
安装Sklearn
Sklearn基本结构
第二章:数据准备与预处理
数据集导入
数据清洗
特征工程
第三章:监督学习
回归模型
分类模型
第四章:无监督学习
聚类算法
降维算法
第五章:模型评估与选择
交叉验证
使用交叉验证评估模型
评分指标
回归模型评分
分类模型评分
模型选择与优化
网格搜索
随机搜索
第六章:高级应用
管道(Pipeline)
使用Pipeline创建工作流
使用GridSearchCV优化Pipeline参数
自定义转换器与评估器
创建自定义转换器
自定义评估器
模型持久化
使用Joblib进行模型持久化
集成学习
使用Voting Classifier进行集成学习
使用Random Forest进行集成学习
使用Gradient Boosting进行集成学习
第七章:实战项目
项目简介与数据集选择
数据预处理
模型训练与评估
模型优化与部署
结束语
未来学习方向与资源推荐
Scikit-learn(Sklearn)是一个开源的机器学习库,基于Python编写,构建在NumPy、SciPy和matplotlib之上。它提供了简单高效的工具用于数据分析和建模,并且在各个领域广泛应用。Sklearn的设计旨在方便重用和扩展,具有高性能、易用性和广泛的社区支持,是数据科学和机器学习项目的首选工具之一。
截至2024年7月,Sklearn的最新版本是1.5.1。这个版本包含了多项重要的改进和新功能,进一步提升了该库的性能和易用性。
Scikit-learn(简称Sklearn)是一个基于Python的开源机器学习库,提供了简单而高效的工具,用于数据挖掘和数据分析。Sklearn建立在NumPy、SciPy和matplotlib之上,具有高性能、易用性和强大的功能。它适用于各种机器学习任务,包括分类、回归、聚类、降维和模型选择等。
fit、predict、transform等方法,数据预处理步骤和模型训练步骤可以无缝衔接。Sklearn可以通过pip或conda轻松安装:
pip install -U scikit-learn conda create -n sklearn-env -c conda-forge scikit-learn conda activate sklearn-env 这两种安装方式都非常简单,只需几行命令即可完成。
Sklearn包含多个模块,每个模块提供特定类型的机器学习算法和工具。以下是主要模块及其功能简介:
StandardScaler用于将数据标准化,使其均值为0,标准差为1。LabelEncoder和OneHotEncoder用于将分类数据编码为数值格式,便于模型处理。SelectKBest可以选择K个最佳特征,RFE(递归特征消除)可以递归地选择特征。train_test_split用于将数据集分为训练集和测试集,GridSearchCV和RandomizedSearchCV用于超参数调优。KMeans用于k均值聚类,AgglomerativeClustering用于层次聚类,DBSCAN用于基于密度的聚类。PCA用于主成分分析,FactorAnalysis用于因子分析。LinearRegression用于线性回归,Ridge用于岭回归,Lasso用于LASSO回归。LogisticRegression用于逻辑回归,SVC用于支持向量机,KNeighborsClassifier用于k近邻分类,RandomForestClassifier用于随机森林分类。数据准备是机器学习中的关键步骤。Sklearn提供了多种方式导入数据:
import pandas as pd data = pd.read_csv('data.csv') from sklearn.datasets import load_iris iris = load_iris() X, y = iris.data, iris.target from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='mean') X_imputed = imputer.fit_transform(X) 特征工程是机器学习中的关键步骤,通过对数据进行变换和处理,提高模型的表现。
from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression model = LogisticRegression() rfe = RFE(model, 5) fit = rfe.fit(X, y) from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) from sklearn.preprocessing import OneHotEncoder encoder = OneHotEncoder() X_encoded = encoder.fit_transform(X_categorical) 监督学习是一种机器学习方法,它使用带标签的数据集来训练模型,以便模型能够对新数据进行预测。监督学习的目标是通过学习输入数据(特征)和输出数据(目标变量)之间的映射关系,从而对未来的输入数据进行预测。监督学习分为回归和分类两大类,分别用于预测连续目标变量和类别标签。
回归分析是一种预测性建模技术,用于预测连续目标变量。以下是几种常见的回归模型:
from sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) LinearRegression,然后使用fit方法在训练数据上训练模型,最后使用predict方法对测试数据进行预测。from sklearn.tree import DecisionTreeRegressor model = DecisionTreeRegressor() model.fit(X_train, y_train) y_pred = model.predict(X_test) DecisionTreeRegressor,然后使用fit方法在训练数据上训练模型,最后使用predict方法对测试数据进行预测。from sklearn.svm import SVR model = SVR() model.fit(X_train, y_train) y_pred = model.predict(X_test) SVR,然后使用fit方法在训练数据上训练模型,最后使用predict方法对测试数据进行预测。分类分析用于预测类别标签,例如垃圾邮件检测、图像分类等。以下是几种常见的分类模型:
from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) LogisticRegression,然后使用fit方法在训练数据上训练模型,最后使用predict方法对测试数据进行预测。from sklearn.neighbors import KNeighborsClassifier model = KNeighborsClassifier() model.fit(X_train, y_train) y_pred = model.predict(X_test) KNeighborsClassifier,然后使用fit方法在训练数据上训练模型,最后使用predict方法对测试数据进行预测。from sklearn.svm import SVC model = SVC() model.fit(X_train, y_train) y_pred = model.predict(X_test) SVC,然后使用fit方法在训练数据上训练模型,最后使用predict方法对测试数据进行预测。from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier() model.fit(X_train, y_train) y_pred = model.predict(X_test) RandomForestClassifier,然后使用fit方法在训练数据上训练模型,最后使用predict方法对测试数据进行预测。无监督学习是一种机器学习技术,它在没有标签或目标变量的情况下进行训练。这意味着模型不会根据预先确定的结果进行学习,而是通过识别数据中的模式和结构来理解数据。无监督学习的主要任务包括聚类分析和降维技术。
聚类分析是一种无监督学习方法,用于将数据集中的样本分组。它的目标是使同一组内的样本尽可能相似,而不同组之间的样本尽可能不同。以下是几种常见的聚类算法:
以下是使用Sklearn实现k均值聚类的示例代码:
from sklearn.cluster import KMeans # 假设X是你的数据集 model = KMeans(n_clusters=3) model.fit(X) labels = model.predict(X) 在这个示例中,我们将数据集X分成了3个簇。labels数组包含每个样本所属的簇标签。
以下是使用Sklearn实现凝聚型层次聚类的示例代码:
from sklearn.cluster import AgglomerativeClustering # 假设X是你的数据集 model = AgglomerativeClustering(n_clusters=3) labels = model.fit_predict(X) 在这个示例中,我们将数据集X分成了3个簇。labels数组包含每个样本所属的簇标签。
以下是使用Sklearn实现DBSCAN的示例代码:
from sklearn.cluster import DBSCAN # 假设X是你的数据集 model = DBSCAN(eps=0.5, min_samples=5) labels = model.fit_predict(X) 在这个示例中,我们使用DBSCAN将数据集X分成不同的簇。labels数组包含每个样本所属的簇标签,其中-1表示噪声样本。
降维技术用于减少数据的维度,提高计算效率和模型性能。降维可以帮助我们更好地理解数据,去除冗余特征,降低噪声,并在可视化中发挥重要作用。以下是两种常见的降维算法:
以下是使用Sklearn实现PCA的示例代码:
from sklearn.decomposition import PCA # 假设X是你的数据集 pca = PCA(n_components=2) X_pca = pca.fit_transform(X) 在这个示例中,我们将数据集X降维到2个主成分。X_pca是降维后的数据。
以下是使用Sklearn实现t-SNE的示例代码:
from sklearn.manifold import TSNE # 假设X是你的数据集 tsne = TSNE(n_components=2) X_tsne = tsne.fit_transform(X) 在这个示例中,我们将数据集X降维到2个嵌入空间。X_tsne是降维后的数据。
模型评估和选择是机器学习流程中的重要环节。它可以帮助我们了解模型的性能、避免过拟合以及选择最优的模型和参数组合。
交叉验证(Cross-validation)是一种用于评估机器学习模型性能的技术,能有效地避免过拟合。它通过将数据集分成多个子集,依次使用其中一个子集作为验证集,其余子集作为训练集进行训练和评估,从而获得更稳定和可靠的性能评估结果。
以下是使用交叉验证评估模型性能的示例代码:
from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X, y, cv=5) print(f'Cross-Validation Scores: {scores}') print(f'Mean Cross-Validation Score: {scores.mean()}') 在上述代码中,我们使用cross_val_score函数对模型进行5折交叉验证(cv=5)。scores存储了每次验证的评分结果,scores.mean()计算了所有评分的平均值。
根据模型的类型不同,Sklearn提供了多种评分指标来评估模型的性能。
回归模型用于预测连续型变量,常用的评分指标包括均方误差、平均绝对误差和决定系数。
from sklearn.metrics import mean_squared_error mse = mean_squared_error(y_true, y_pred) print(f'Mean Squared Error: {mse}') from sklearn.metrics import mean_absolute_error mae = mean_absolute_error(y_true, y_pred) print(f'Mean Absolute Error: {mae}') from sklearn.metrics import r2_score r2 = r2_score(y_true, y_pred) print(f'R² Score: {r2}') 分类模型用于预测离散型类别标签,常用的评分指标包括准确率、精确率、召回率、F1分数和混淆矩阵。
from sklearn.metrics import accuracy_score accuracy = accuracy_score(y_true, y_pred) print(f'Accuracy: {accuracy}') from sklearn.metrics import precision_score, recall_score, f1_score precision = precision_score(y_true, y_pred, average='macro') recall = recall_score(y_true, y_pred, average='macro') f1 = f1_score(y_true, y_pred, average='macro') print(f'Precision: {precision}') print(f'Recall: {recall}') print(f'F1 Score: {f1}') from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_true, y_pred) print(f'Confusion Matrix:\n{cm}') 混淆矩阵能显示分类模型在各个类别上的预测情况,包括真正类(TP)、假正类(FP)、假负类(FN)和真负类(TN)的数量,有助于进一步分析模型性能。
选择和优化模型是提高机器学习项目成功率的重要步骤。通过调整模型的超参数,我们可以提升模型的性能。
网格搜索(Grid Search)是一种通过穷举所有可能的超参数组合来寻找最优参数的技术。
from sklearn.model_selection import GridSearchCV param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']} grid_search = GridSearchCV(SVC(), param_grid, cv=5) grid_search.fit(X_train, y_train) print(f'Best Parameters: {grid_search.best_params_}') print(f'Best Score: {grid_search.best_score_}') 在上述代码中,我们定义了参数网格param_grid,其中包括支持向量机(SVC)模型的超参数C和kernel。然后,我们使用GridSearchCV进行5折交叉验证,找到最优的超参数组合。
随机搜索(Randomized Search)是一种在给定的参数范围内随机采样超参数组合,以找到近似最优参数的技术。与网格搜索相比,随机搜索在高维参数空间中更有效。
from sklearn.model_selection import RandomizedSearchCV param_distributions = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']} random_search = RandomizedSearchCV(SVC(), param_distributions, n_iter=10, cv=5) random_search.fit(X_train, y_train) print(f'Best Parameters: {random_search.best_params_}') print(f'Best Score: {random_search.best_score_}') 在上述代码中,我们定义了参数分布param_distributions,然后使用RandomizedSearchCV进行10次随机搜索,结合5折交叉验证,找到近似最优的超参数组合。
管道(Pipeline)是一种非常有用的工具,可以将多个数据处理步骤和模型训练步骤串联起来,形成一个完整的工作流。这不仅简化了代码,还能方便地进行参数调整和模型评估。在构建复杂的机器学习工作流时,使用管道可以确保所有步骤的顺序执行,避免数据泄露和重复代码。
例如,我们可以将数据标准化和逻辑回归模型训练这两个步骤串联起来:
from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression pipeline = Pipeline([ ('scaler', StandardScaler()), ('classifier', LogisticRegression()) ]) pipeline.fit(X_train, y_train) y_pred = pipeline.predict(X_test) 在这个示例中,数据首先通过StandardScaler进行标准化处理,然后通过LogisticRegression进行训练和预测。使用Pipeline不仅简化了代码,还能确保数据处理步骤的顺序执行。
我们可以使用GridSearchCV对Pipeline中的各个步骤进行参数优化:
from sklearn.model_selection import GridSearchCV param_grid = { 'scaler__with_mean': [True, False], 'classifier__C': [0.1, 1, 10] } grid_search = GridSearchCV(pipeline, param_grid, cv=5) grid_search.fit(X_train, y_train) print(f'Best parameters: {grid_search.best_params_}') print(f'Best score: {grid_search.best_score_}') 通过这种方式,我们可以同时优化数据处理步骤和模型的超参数,提高整体模型的性能。
有时,内置的转换器和评估器无法满足特定需求,这时可以创建自定义的转换器与评估器。自定义转换器继承自BaseEstimator和TransformerMixin,实现fit和transform方法。
例如,创建一个将数据平方的转换器:
from sklearn.base import BaseEstimator, TransformerMixin class SquareTransformer(BaseEstimator, TransformerMixin): def fit(self, X, y=None): return self def transform(self, X): return X ** 2 square_transformer = SquareTransformer() X_squared = square_transformer.fit_transform(X) 自定义评估器同样继承自BaseEstimator,并实现相应的评估方法。例如,创建一个自定义评估器用于评估模型性能:
from sklearn.base import BaseEstimator class CustomEstimator(BaseEstimator): def __init__(self, param1=1): self.param1 = param1 def fit(self, X, y): # 自定义拟合逻辑 return self def predict(self, X): # 自定义预测逻辑 return X * self.param1 custom_estimator = CustomEstimator(param1=2) custom_estimator.fit(X_train, y_train) y_pred = custom_estimator.predict(X_test) 通过自定义转换器和评估器,可以灵活地满足各种数据处理和模型评估需求。
通过持久化模型,可以在不同的会话中重新加载模型,而不需要重新训练。这对于部署机器学习模型非常重要。
Joblib是一个高效的工具,用于序列化Python对象,包括机器学习模型:
import joblib # 保存模型 joblib.dump(model, 'model.pkl') # 加载模型 model = joblib.load('model.pkl') 通过Joblib,可以轻松地保存和加载机器学习模型,确保模型在不同环境中的可重用性。
集成学习(Ensemble Learning)通过结合多个模型的预测结果,提高整体预测性能。常见的集成学习方法包括投票分类器(Voting Classifier)、随机森林(Random Forest)和梯度提升树(Gradient Boosting Trees)。
Voting Classifier通过结合多个不同的分类器,生成最终的预测结果:
from sklearn.ensemble import VotingClassifier from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.svm import SVC model = VotingClassifier(estimators=[ ('lr', LogisticRegression()), ('rf', RandomForestClassifier()), ('svc', SVC(probability=True)) ], voting='soft') model.fit(X_train, y_train) y_pred = model.predict(X_test) 在这个示例中,我们结合了逻辑回归、随机森林和支持向量机三个模型,通过软投票(soft voting)生成最终的预测结果。软投票是基于概率的投票方式,可以提供更精确的预测结果。
随机森林是通过构建多个决策树并结合其预测结果进行预测的集成学习方法:
from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=100) model.fit(X_train, y_train) y_pred = model.predict(X_test) 随机森林可以有效地降低模型的方差,提供更稳定的预测结果。
梯度提升树通过逐步构建一系列弱学习器(通常是决策树),并结合它们的预测结果进行预测:
from sklearn.ensemble import GradientBoostingClassifier model = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1) model.fit(X_train, y_train) y_pred = model.predict(X_test) 梯度提升树可以在保留较低偏差的同时进一步降低方差,从而提高模型的预测性能。
在本节中,我们将选择一个公开数据集并通过实际项目来演示Sklearn的使用。我们选择Kaggle上的经典泰坦尼克数据集(Titanic - Machine Learning from Disaster)作为示例。这是一个二分类问题,目标是预测乘客是否在泰坦尼克号沉没事件中幸存。
数据预处理是机器学习中至关重要的一步,包含数据清洗、特征工程和数据分割等步骤。以下是详细步骤:
import pandas as pd train_df = pd.read_csv('train.csv') test_df = pd.read_csv('test.csv') # 检查缺失值 print(train_df.isnull().sum()) # 用中位数填补年龄的缺失值 train_df['Age'].fillna(train_df['Age'].median(), inplace=True) # 用众数填补船舱等级的缺失值 train_df['Embarked'].fillna(train_df['Embarked'].mode()[0], inplace=True) # 对于Cabin列,我们可以选择删除或进行更复杂的填补 train_df.drop(columns=['Cabin'], inplace=True) from sklearn.preprocessing import LabelEncoder labelencoder = LabelEncoder() train_df['Sex'] = labelencoder.fit_transform(train_df['Sex']) train_df['Embarked'] = labelencoder.fit_transform(train_df['Embarked']) train_df['FamilySize'] = train_df['SibSp'] + train_df['Parch'] + 1 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() train_df[['Age', 'Fare']] = scaler.fit_transform(train_df[['Age', 'Fare']]) from sklearn.model_selection import train_test_split X = train_df.drop(columns=['Survived', 'PassengerId', 'Name', 'Ticket']) y = train_df['Survived'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) 选择合适的模型进行训练,并使用交叉验证和评分指标评估模型性能。
from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X, y, cv=5) print(f'Cross-Validation Scores: {scores}') print(f'Mean Cross-Validation Score: {scores.mean()}') from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) print(f'Accuracy: {accuracy}') print(f'Precision: {precision}') print(f'Recall: {recall}') print(f'F1 Score: {f1}') 通过网格搜索或随机搜索优化模型参数,将优化后的模型保存并部署到生产环境。
from sklearn.model_selection import GridSearchCV param_grid = { 'C': [0.1, 1, 10, 100], 'solver': ['newton-cg', 'lbfgs', 'liblinear'] } grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5) grid_search.fit(X_train, y_train) print(f'Best Parameters: {grid_search.best_params_}') print(f'Best Score: {grid_search.best_score_}') from sklearn.model_selection import RandomizedSearchCV param_distributions = { 'C': [0.1, 1, 10, 100], 'solver': ['newton-cg', 'lbfgs', 'liblinear'] } random_search = RandomizedSearchCV(LogisticRegression(), param_distributions, n_iter=10, cv=5) random_search.fit(X_train, y_train) print(f'Best Parameters: {random_search.best_params_}') print(f'Best Score: {random_search.best_score_}') import joblib joblib.dump(grid_search.best_estimator_, 'titanic_model.pkl') model = joblib.load('titanic_model.pkl') from flask import Flask, request, jsonify import joblib app = Flask(__name__) model = joblib.load('titanic_model.pkl') @app.route('/predict', methods=['POST']) def predict(): data = request.get_json(force=True) prediction = model.predict([data['features']]) return jsonify({'prediction': int(prediction[0])}) if __name__ == '__main__': app.run(debug=True) Sklearn(Scikit-learn)提供了一整套简单高效的机器学习工具,适用于各种数据科学和机器学习任务。通过本教程的学习,希望你能够熟练掌握Sklearn的基础知识和使用方法,并能在实际项目中灵活应用。
Sklearn的优势在于其简洁一致的API设计、强大的功能和广泛的社区支持,使其成为机器学习初学者和专家的理想工具。无论你是数据科学家、机器学习工程师,还是研究人员,Sklearn都能帮助你快速构建、评估和优化模型,解决各种复杂的数据问题。
掌握了Sklearn的基础知识后,可以通过以下资源和方向进一步提升你的机器学习技能和知识:
本主页会定期更新,为了能够及时获得更新,敬请关注我:点击左下角的关注。也可以关注公众号:请在微信上搜索公众号“AI与编程之窗”并关注,或者扫描以下公众号二维码关注,以便在内容更新时直接向您推送。