Scikit-learn高级功能与Python实践

发布于:2025-07-30 ⋅ 阅读:(21) ⋅ 点赞:(0)

数据预处理的高级技巧

复杂缺失值处理

在实际应用中,数据缺失情况往往较为复杂。除了简单的均值、众数填充外,Scikit-learn提供了更高级的处理方式。例如,使用IterativeImputer进行多重插补,它基于其他特征对缺失值进行预测填充。以下是一个示例代码:

import numpy as np
import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

# 创建包含缺失值的数据
data = {'A': [1, 2, np.nan, 4], 'B': [5, np.nan, np.nan, 8], 'C': [9, 10, 11, 12]}
df = pd.DataFrame(data)

# 初始化迭代插补器
imputer = IterativeImputer(max_iter=10, random_state=0)

# 进行插补
imputed_data = imputer.fit_transform(df)
print(imputed_data)

在这个例子中,IterativeImputer通过迭代的方式,利用其他列的信息来填充缺失值,能够更好地处理复杂的缺失数据情况。

特征缩放与归一化

特征缩放是机器学习中非常重要的预处理步骤。Scikit-learn提供了多种缩放方法,如标准化(StandardScaler)、最小最大缩放(MinMaxScaler)等。以标准化为例,代码如下:

from sklearn.preprocessing import StandardScaler

# 创建示例数据
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 初始化标准化器
scaler = StandardScaler()

# 进行标准化
scaled_data = scaler.fit_transform(data)
print(scaled_data)

标准化后的数据均值为0,方差为1,有助于提升模型的收敛速度和性能。不同的缩放方法适用于不同的数据场景,需要根据具体情况选择合适的方法。

模型选择与评估策略

交叉验证的深入应用

交叉验证是一种常用的模型评估方法,Scikit-learn提供了多种交叉验证方式。其中,KFold是最基础的交叉验证方法之一,它将数据集划分为K个子集,轮流用K - 1个子集作为训练集,1个子集作为测试集。以下是一个使用KFold的示例:

from sklearn.model_selection import KFold
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 初始化KFold
kf = KFold(n_splits=5)

# 遍历每个折叠进行训练和评估
for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # 初始化模型并训练
    model = LogisticRegression()
    model.fit(X_train, y_train)
    
    # 在测试集上进行预测并计算准确率
    accuracy = model.score(X_test, y_test)
    print(f'Accuracy: {accuracy}')

除了KFold,还有StratifiedKFold,它在划分数据集时会保持每个子集中各类别的比例与原始数据集相同,这对于类别不平衡的数据集非常有用。

超参数调优

超参数对模型的性能有着重要影响。Scikit-learn提供了GridSearchCVRandomizedSearchCV来进行超参数调优。GridSearchCV会遍历所有可能的参数组合,而RandomizedSearchCV则会在给定的参数空间中随机采样一定数量的参数组合进行搜索,效率更高。以下是使用GridSearchCV的示例:

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

# 定义参数网格
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}

# 初始化GridSearchCV
grid_search = GridSearchCV(SVC(), param_grid, cv=5)

# 进行超参数调优
grid_search.fit(X, y)

# 输出最佳参数和最佳得分
print(f'Best Parameters: {grid_search.best_params_}')
print(f'Best Score: {grid_search.best_score_}')

通过超参数调优,可以找到使模型性能最佳的参数组合,从而提升模型的泛化能力。

集成学习与模型融合

投票分类器

投票分类器是一种简单而有效的集成学习方法。它通过多个基分类器的预测结果进行投票,得出最终的分类结果。Scikit-learn提供了VotingClassifier来实现投票分类器。以下是一个示例:

from sklearn.ensemble import VotingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC

# 初始化基分类器
clf1 = DecisionTreeClassifier()
clf2 = GaussianNB()
clf3 = SVC(probability=True)

# 初始化投票分类器
voting_clf = VotingClassifier(estimators=[('dt', clf1), ('nb', clf2), ('svc', clf3)], voting='soft')

# 训练投票分类器
voting_clf.fit(X, y)

# 在测试集上进行预测并计算准确率
accuracy = voting_clf.score(X_test, y_test)
print(f'Accuracy: {accuracy}')

在这个例子中,VotingClassifier使用了软投票(voting='soft'),即根据各个基分类器的预测概率进行加权平均,然后选择概率最大的类别作为最终结果。硬投票则是直接根据多数表决结果进行分类。

堆叠泛化

堆叠泛化是一种更复杂的集成学习方法,它将多个基学习器的输出作为新的特征,再使用一个次级学习器进行最终的预测。Scikit-learn提供了StackingClassifierStackingRegressor来实现堆叠泛化。以下是一个简单的示例:

from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier

# 初始化基学习器
clf1 = LogisticRegression()
clf2 = KNeighborsClassifier()
clf3 = RandomForestClassifier()

# 初始化堆叠分类器
stacking_clf = StackingClassifier(estimators=[('lr', clf1), ('knn', clf2), ('rf', clf3)], final_estimator=LogisticRegression())

# 训练堆叠分类器
stacking_clf.fit(X, y)

# 在测试集上进行预测并计算准确率
accuracy = stacking_clf.score(X_test, y_test)
print(f'Accuracy: {accuracy}')

堆叠泛化能够充分利用各个基学习器的优势,进一步提高模型的性能。

无监督学习与降维技术

主成分分析(PCA)

主成分分析是一种常用的降维技术,它可以将高维数据投影到低维空间,同时保留数据的主要特征。Scikit-learn提供了PCA类来实现主成分分析。以下是一个示例:

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 创建示例数据
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5]])

# 初始化PCA,设置主成分数量为1
pca = PCA(n_components=1)

# 进行降维
X_pca = pca.fit_transform(X)

# 输出降维后的数据
print(X_pca)

# 可视化降维结果(如果维度为2或3可可视化)
# plt.scatter(X_pca[:, 0], X_pca[:, 1])
# plt.show()

在这个例子中,将二维数据降维到一维。PCA通过寻找数据中方差最大的方向,将数据投影到该方向上,从而实现降维。降维后的数据可以用于可视化、特征提取等任务。

t-SNE与UMAP

t-SNE和UMAP是两种常用的非线性降维技术,它们在处理高维数据的可视化方面表现出色。以下是使用t-SNE和UMAP的示例代码:

from sklearn.manifold import TSNE
import umap

# 创建示例数据(这里使用鸢尾花数据集)
X = iris.data
y = iris.target

# 使用t-SNE进行降维
tsne = TSNE(n_components=2, random_state=0)
X_tsne = tsne.fit_transform(X)

# 可视化t-SNE降维结果
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y)
plt.title('t-SNE')
plt.show()

# 使用UMAP进行降维
reducer = umap.UMAP(n_components=2)
X_umap = reducer.fit_transform(X)

# 可视化UMAP降维结果
plt.scatter(X_umap[:, 0], X_umap[:, 1], c=y)
plt.title('UMAP')
plt.show()

t-SNE和UMAP都能够将高维数据映射到低维空间,并且在处理复杂的数据结构时具有较好的效果。它们在数据探索和可视化方面有着广泛的应用。


网站公告

今日签到

点亮在社区的每一天
去签到