赞
踩
scikit-learn
(sklearn
)是一个用于机器学习的Python库,它提供了广泛的算法和工具,用于数据预处理、模型构建、模型评估、模型选择等。scikit-learn
的设计遵循一致的API原则,使得使用不同的模型和算法变得简单且直观。以下是scikit-learn
的主要组件及其功能:
sklearn.preprocessing
)提供了一系列的工具和方法,用于对原始数据进行清洗和转换,以便它们更适合于机器学习模型的训练。包括特征缩放(如标准化、归一化)、编码分类特征(如独热编码)、生成多项式特征等。
- from sklearn.preprocessing import StandardScaler, MinMaxScaler, OneHotEncoder, PolynomialFeatures
- import numpy as np
-
- # 假设我们有以下数据集
- X = np.array([[1, 2, 3],
- [4, 5, 6],
- [7, 8, 9]])
- y = np.array(['cat', 'dog', 'dog'])
-
- # 特征缩放
- ## 标准化
- scaler_standard = StandardScaler()
- X_scaled_standard = scaler_standard.fit_transform(X)
- print("Standardized features:\n", X_scaled_standard)
-
- ## 归一化
- scaler_minmax = MinMaxScaler()
- X_scaled_minmax = scaler_minmax.fit_transform(X)
- print("Min-Max normalized features:\n", X_scaled_minmax)
-
- # 编码分类特征
- ## 独热编码
- encoder = OneHotEncoder(sparse=False)
- y_encoded = encoder.fit_transform(y.reshape(-1, 1))
- print("One-hot encoded labels:\n", y_encoded)
-
- # 生成多项式特征
- ## 生成二次多项式特征
- poly_features = PolynomialFeatures(degree=2, include_bias=False)
- X_poly = poly_features.fit_transform(X)
- print("Polynomial features:\n", X_poly)
-

sklearn.feature_selection
)用于从数据中选择最有用的特征,可以提高模型的效率和性能。特征选择方法包括单变量统计测试、递归特征消除等。
- from sklearn.feature_selection import SelectKBest, f_classif, RFE
- from sklearn.ensemble import RandomForestClassifier
- from sklearn.datasets import load_iris
-
- # 加载数据集
- iris = load_iris()
- X, y = iris.data, iris.target
-
- # 方法1: 使用单变量统计测试选择特征
- select_k_best = SelectKBest(score_func=f_classif, k=2)
- X_selected_k_best = select_k_best.fit_transform(X, y)
- print("Features selected by SelectKBest:\n", X_selected_k_best[0:5])
-
- # 方法2: 使用递归特征消除选择特征
- rfe = RFE(estimator=RandomForestClassifier(), n_features_to_select=2, step=1)
- X_selected_rfe = rfe.fit_transform(X, y)
- print("Features selected by RFE:\n", X_selected_rfe[0:5])
-

在这个示例中,我们展示了使用sklearn.feature_selection
模块的两种特征选择方法:SelectKBest
和Recursive Feature Elimination (RFE)
,使用的是著名的Iris数据集。
SelectKBest
)SelectKBest
:此方法根据单变量统计测试选择特征。这里使用的是f_classif
,它适用于分类任务,并选择最重要的k
个特征(这里k=2
)。SelectKBest
选出的前五个样本的两个最重要特征。RFE
)RFE
:递归特征消除(Recursive Feature Elimination)通过递归减少特征集的大小来选择特征。它使用一个基模型(这里使用RandomForestClassifier
)来估计特征的重要性,并递归地移除最不重要的特征。n_features_to_select=2
指定了最终选择的特征数,step=1
表示每次迭代中移除的特征数。RFE
选出的前五个样本的两个最重要特征。这两种方法从不同角度解决了特征选择的问题:
SelectKBest
**直接根据单变量统计测试的得分来选择特征,适用于快速筛选重要特征。RFE
**则通过递归地构建模型并且移除最不重要的特征来选择特征,这需要更多的计算,但通常能够得到更优化的特征子集,尤其是在特征与目标之间的关系更复杂时。特征选择对于提高模型的性能、减少模型训练时间以及防止数据维度过高导致的过拟合非常关键。通过减少特征数量,模型训练变得更加高效,同时模型的可解释性也会提高。
sklearn.feature_extraction
)特别用于从文本和图像数据中提取特征。例如,从文本数据中提取词袋模型特征,或者从图像数据中提取可以用于机器学习模型的特征。
- from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
- from sklearn.feature_extraction import DictVectorizer
-
- # 文本数据示例
- text_data = ["Life is like a box of chocolates",
- "You never know what you're gonna get",
- "Life is not all about waiting for the storm to pass"]
-
- # 从文本数据中提取特征
- ## 使用词袋模型(CountVectorizer)
- count_vectorizer = CountVectorizer()
- X_count = count_vectorizer.fit_transform(text_data)
- print("Features extracted with CountVectorizer:\n", X_count.toarray())
-
- ## 使用TF-IDF编码(TfidfVectorizer)
- tfidf_vectorizer = TfidfVectorizer()
- X_tfidf = tfidf_vectorizer.fit_transform(text_data)
- print("Features extracted with TfidfVectorizer:\n", X_tfidf.toarray())
-
- # 字典数据示例
- dict_data = [{'age': 35, 'city': 'Tokyo'}, {'age': 25, 'city': 'New York'}, {'age': 45, 'city': 'London'}]
-
- # 从字典数据中提取特征
- dict_vectorizer = DictVectorizer(sparse=False)
- X_dict = dict_vectorizer.fit_transform(dict_data)
- print("Features extracted from dict data:\n", X_dict)
- print("Feature names:", dict_vectorizer.get_feature_names_out())
-

在这个示例中,我们展示了如何使用sklearn.feature_extraction
模块从文本和字典数据中提取特征。
使用词袋模型(CountVectorizer
)
CountVectorizer
将文本数据转换为特征矩阵,其中每个条目是单词出现的次数。这种表示忽略了单词出现的顺序,但在许多情况下仍然非常有效。使用TF-IDF编码(TfidfVectorizer
)
TfidfVectorizer
将文本数据转换为TF-IDF特征矩阵。TF-IDF(Term Frequency-Inverse Document Frequency)考虑了词频(TF)和逆文档频率(IDF),有助于减少常见词的影响,强调重要单词。DictVectorizer
DictVectorizer
用于将字典列表转换为特征矩阵。这对于处理离散数据特别有用,例如在处理分类数据时。DictVectorizer
转换后的特征矩阵包括数值特征(如年龄)和通过独热编码转换的分类特征(城市)。通过上述方法,我们可以从文本和字典数据中有效地提取特征,使其适用于机器学习模型的训练。这些特征提取技术是处理非数值数据、文本数据或分类数据时的关键步骤
scikit-learn
提供了广泛的算法库,用于分类、回归、聚类和异常检测等任务。
sklearn.linear_model
、sklearn.svm
、sklearn.ensemble
等):提供了逻辑回归、线性回归、支持向量机、决策树、随机森林等算法。sklearn.cluster
):提供了K-means、DBSCAN、层次聚类等算法。sklearn.decomposition
):提供了PCA、NMF、LDA等算法,用于降低数据维度和特征提取。- from sklearn.datasets import load_iris
- from sklearn.model_selection import train_test_split
- from sklearn.preprocessing import StandardScaler
- from sklearn.linear_model import LogisticRegression
- from sklearn.svm import SVC
- from sklearn.ensemble import RandomForestClassifier
- from sklearn.cluster import KMeans
- from sklearn.decomposition import PCA
-
- # 加载数据集
- iris = load_iris()
- X, y = iris.data, iris.target
-
- # 数据预处理
- scaler = StandardScaler()
- X_scaled = scaler.fit_transform(X)
-
- # 分类:逻辑回归、支持向量机(SVM)、随机森林
- ## 逻辑回归
- log_reg = LogisticRegression()
- log_reg.fit(X_scaled, y)
-
- ## 支持向量机(SVM)
- svm_clf = SVC()
- svm_clf.fit(X_scaled, y)
-
- ## 随机森林
- rf_clf = RandomForestClassifier()
- rf_clf.fit(X_scaled, y)
-
- # 聚类:K-means
- kmeans = KMeans(n_clusters=3)
- kmeans.fit(X_scaled)
- clusters = kmeans.labels_
-
- # 降维:PCA
- pca = PCA(n_components=2)
- X_pca = pca.fit_transform(X_scaled)
-
- # 输出部分结果
- print("逻辑回归预测:", log_reg.predict(X_scaled[:5]))
- print("SVM预测:", svm_clf.predict(X_scaled[:5]))
- print("随机森林预测:", rf_clf.predict(X_scaled[:5]))
- print("K-means聚类结果:", clusters[:5])
- print("PCA降维结果前5个样本:\n", X_pca[:5])
-

在这个示例中,我们演示了如何使用scikit-learn
库进行分类、聚类和降维任务,以及如何对数据进行预处理。
我们使用逻辑回归(LogisticRegression
)、支持向量机(SVC
)和随机森林(RandomForestClassifier
)作为分类器来预测Iris数据集的类别。这些模型被训练来识别数据集中的不同Iris花的类型。
使用K-means聚类算法(KMeans
)对数据进行聚类,指定了3个聚类中心(因为Iris数据集有3类)。KMeans
尝试将数据分为3个聚类,以发现数据中的潜在分组。
通过主成分分析(PCA
)对特征进行降维,将数据从4维降到2维。降维是一种有效的数据预处理技术,它可以减少数据的复杂性,同时尽量保留原始数据的信息。
clusters
数组展示了K-means算法将每个样本分配到的聚类。通过这些步骤,我们可以看到scikit-learn
提供了丰富的工具和算法来支持从简单到复杂的机器学习任务,包括但不限于分类、聚类和降维。这些任务是探索、理解和预测数据的基础。
sklearn.model_selection
)提供了工具和方法用于交叉验证、网格搜索参数优化等,以评估模型性能和选择最优模型。
train_test_split
):将数据集分成训练集和测试集。KFold
、StratifiedKFold
):用于更准确地评估模型性能。GridSearchCV
、RandomizedSearchCV
):用于寻找最优的模型参数。- from sklearn.datasets import load_iris
- from sklearn.model_selection import train_test_split, KFold, GridSearchCV
- from sklearn.svm import SVC
- from sklearn.metrics import accuracy_score
-
- # 加载数据集
- iris = load_iris()
- X, y = iris.data, iris.target
-
- # 数据划分:将数据集分成训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 交叉验证:使用KFold
- kf = KFold(n_splits=5, shuffle=True, random_state=42)
- for train_index, test_index in kf.split(X):
- X_train_kf, X_test_kf = X[train_index], X[test_index]
- y_train_kf, y_test_kf = y[train_index], y[test_index]
- # 在这里可以进行模型训练和评估...
-
- # 超参数优化:使用GridSearchCV寻找SVC的最优参数
- param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001], 'kernel': ['rbf']}
- grid_search = GridSearchCV(SVC(), param_grid, cv=5)
- grid_search.fit(X_train, y_train)
- print("Best parameters:", grid_search.best_params_)
-
- # 使用最优参数训练模型并评估性能
- best_model = grid_search.best_estimator_
- y_pred = best_model.predict(X_test)
- print("Test set accuracy:", accuracy_score(y_test, y_pred))
-

在这个示例中,我们使用了scikit-learn
的model_selection
模块来演示数据划分、交叉验证和超参数优化的过程。
使用train_test_split
函数将Iris数据集分成了训练集和测试集,其中测试集占总数据的20%。这是机器学习项目中非常常见的步骤,旨在确保模型能够在未见过的数据上进行评估。
使用KFold
进行5折交叉验证。在这个过程中,数据被分成5个部分,模型将在4/5的数据上进行训练,在剩下的1/5的数据上进行评估,这个过程重复5次。这有助于我们更准确地估计模型的性能。在示例中,我们演示了如何设置KFold
,但没有展示在每次分割后训练和评估模型的具体代码。
使用GridSearchCV
对SVC(支持向量机分类器)进行超参数优化。我们定义了一个参数网格来搜索最佳的C
(正则化强度)、gamma
(核函数的系数)和kernel
类型。GridSearchCV
自动进行了交叉验证来评估不同参数组合的效果,并找到了最优参数组合。
最后,我们使用找到的最优参数训练模型,并在测试集上评估了模型的准确性。在这个示例中,最优模型在测试集上的准确率达到了100%。
这个过程展示了如何使用scikit-learn
的model_selection
模块进行有效的模型评估和选择。通过这种方式,我们可以确保选择出的模型既能够很好地拟合训练数据,又具有良好的泛化能力。
sklearn.metrics
)提供了一系列用于评估模型性能的指标,包括准确率、召回率、F1分数、ROC曲线、均方误差等,适用于不同类型的机器学习任务。
- from sklearn.metrics import accuracy_score, recall_score, f1_score, roc_auc_score, mean_squared_error
- from sklearn.model_selection import train_test_split
- from sklearn.ensemble import RandomForestClassifier
- from sklearn.datasets import make_classification
- from sklearn.linear_model import LinearRegression
- import numpy as np
-
- # 生成模拟的分类数据集
- X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 训练随机森林分类器
- clf = RandomForestClassifier(random_state=42)
- clf.fit(X_train, y_train)
- y_pred = clf.predict(X_test)
- y_prob = clf.predict_proba(X_test)[:, 1]
-
- # 评价分类模型
- print("Accuracy:", accuracy_score(y_test, y_pred))
- print("Recall:", recall_score(y_test, y_pred))
- print("F1 Score:", f1_score(y_test, y_pred))
- print("ROC AUC Score:", roc_auc_score(y_test, y_prob))
-
- # 生成模拟的回归数据集
- X, y = make_classification(n_samples=100, n_features=1, n_informative=1, n_targets=1, random_state=42)
- y = y + np.random.randn(100) * 0.1 # 添加一些噪声
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 训练线性回归模型
- reg = LinearRegression()
- reg.fit(X_train, y_train)
- y_pred = reg.predict(X_test)
-
- # 评价回归模型
- print("Mean Squared Error:", mean_squared_error(y_test, y_pred))
-

在上述代码中,我们首先展示了如何使用sklearn.metrics
模块中的不同指标来评估分类模型的性能,然后尝试生成和评估一个回归模型,但在生成回归数据集时遇到了一个错误。这是因为make_classification
函数被错误地用来生成回归数据集,而实际上应该使用make_regression
函数来生成回归任务的数据。让我们更正这个错误,并继续评估回归模型:
我们使用随机森林分类器(RandomForestClassifier
)作为示例,并计算了几个关键的分类指标:
- from sklearn.datasets import make_regression
-
- # 生成模拟的回归数据集
- X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 训练线性回归模型
- reg = LinearRegression()
- reg.fit(X_train, y_train)
- y_pred = reg.predict(X_test)
-
- # 评价回归模型
- print("Mean Squared Error:", mean_squared_error(y_test, y_pred))
这部分代码更正后生成了回归数据集,并使用线性回归模型进行了训练和预测。我们使用均方误差(MSE)作为评价指标来量化模型预测值和实际值之间的差异。MSE越小,表示模型预测的准确性越高。
通过这两部分的演示,我们可以看到sklearn.metrics
提供了丰富的指标来评估模型的性能,适用于不同类型的机器学习任务。正确地选择和使用这些指标对于理解模型性能、进行模型选择和优化非常关键。
sklearn.pipeline
)管道用于将多个处理步骤封装为一个单一的过程,这对于流线化机器学习工作流程非常有用。通过管道,可以将数据预处理、特征选择和模型训练步骤链接起来,简化代码并减少错误。
- from sklearn.pipeline import Pipeline
- from sklearn.preprocessing import StandardScaler
- from sklearn.decomposition import PCA
- from sklearn.linear_model import LogisticRegression
- from sklearn.datasets import load_iris
-
- # 加载数据集
- iris = load_iris()
- X, y = iris.data, iris.target
-
- # 创建管道
- # 管道包含三个步骤:数据标准化、降维(PCA)、训练逻辑回归模型
- pipeline = Pipeline(steps=[
- ('scaler', StandardScaler()),
- ('pca', PCA(n_components=2)),
- ('logistic_regression', LogisticRegression())
- ])
-
- # 使用管道训练模型
- pipeline.fit(X, y)
-
- # 使用管道预测
- y_pred = pipeline.predict(X)
-
- # 输出模型在训练集上的准确率
- print("Training accuracy:", pipeline.score(X, y))
-

在这个示例中,我们展示了如何使用scikit-learn
的Pipeline
类来创建一个机器学习管道,该管道封装了数据预处理、特征降维和模型训练的步骤。
我们定义了一个管道,它由以下三个顺序执行的步骤组成:
'scaler'
):使用StandardScaler
对特征进行标准化处理,确保每个特征的均值为0,方差为1。'pca'
):通过主成分分析(PCA)将特征空间降维到2维。这有助于简化模型并可能提高性能。'logistic_regression'
):最后,使用降维后的特征训练一个逻辑回归模型。fit
方法训练管道,这将按照管道中定义的顺序,先对数据进行标准化,然后进行PCA降维,最后使用降维后的特征训练逻辑回归模型。predict
方法进行预测,管道自动将相同的预处理步骤应用于输入数据,并使用训练好的模型进行预测。score
方法评估模型在整个训练集上的准确率。使用管道的优势包括:
在这个示例中,管道训练后在训练集上的准确率为约93.33%,展示了一个简单但有效的机器学习工作流程。
scikit-learn
的这些组件共同构成了一个强大的机器学习库,可以应用于从简单到复杂的各种机器学习任务。其一致的API设计和丰富的文档使得scikit-learn
非常适合机器学习初学者和专业人士使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。