Python从入门到中级实战:Sklearn机器学习编程中级进阶指南

B站影视 韩国电影 2025-05-19 14:00 1

摘要:在机器学习领域,Scikit - learn(简称Sklearn)是Python开发者的得力助手。它基于NumPy、SciPy和matplotlib等库构建,提供了丰富且高效的机器学习算法和工具,广泛应用于数据挖掘、数据分析和预测建模等场景。当你已经掌握了Sk

在机器学习领域,Scikit - learn(简称Sklearn)是Python开发者的得力助手。它基于NumPy、SciPy和matplotlib等库构建,提供了丰富且高效的机器学习算法和工具,广泛应用于数据挖掘、数据分析和预测建模等场景。当你已经掌握了Sklearn的基础使用,如简单的模型训练与预测,接下来的中级教程将带你深入探索其核心功能,学会更复杂的模型应用、模型评估与调优技巧以及强大的特征工程方法。通过真实的爆款案例分析,让你在实践中真正掌握Sklearn的精髓,为解决复杂的实际问题奠定坚实基础。

(一)环境搭建

确保你的开发环境安装了Python以及相关依赖库。推荐使用Anaconda进行环境管理,在命令行中输入以下命令创建并激活一个新环境,并安装所需库:

conda create -n sklearn_env python=3.8

conda activate sklearn_env

conda install numpy scipy matplotlib pandas scikit - learn jupyter

(二)基础回顾

在深入学习之前,先简单回顾Sklearn基础:

1. 数据集加载:Sklearn内置了许多经典数据集,如鸢尾花数据集(load_iris)、手写数字数据集(load_digits)等。使用sklearn.datasets模块加载,例如:

from sklearn.datasets import load_iris

iris = load_iris

X = iris.data

y = iris.target

2. 模型训练与预测基础:使用fit方法训练模型,predict方法进行预测。如使用逻辑回归进行分类:

from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LogisticRegression

model.fit(X_train, y_train)

y_pred = model.predict(X_test)

(一)线性模型:房价预测案例

线性回归是一种基本的回归模型,假设输入特征与输出目标之间存在线性关系。在房价预测这个经典案例中,许多房地产公司都在尝试利用各种房屋特征来预测房价,以便为购房者和卖家提供准确的价格参考 。

1. 原理简述:通过最小化损失函数(通常是均方误差)来找到最佳的线性系数,使得预测值与真实值之间的误差最小。

2. Sklearn实现:

from sklearn.linear_model import LinearRegression

from sklearn.datasets import fetch_california_housing

from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_squared_error

# 加载加州房价数据集

housing = fetch_california_housing

X = housing.data

y = housing.target

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练线性回归模型

model = LinearRegression

model.fit(X_train, y_train)

# 预测并评估

y_pred = model.predict(X_test)

mse = mean_squared_error(y_test, y_pred)

print(f"均方误差: {mse}")

在这个案例中,通过线性回归模型对房价进行预测,均方误差可以衡量模型预测值与真实房价之间的平均误差大小。实际应用中,房地产公司可以利用这个模型,根据房屋面积、房间数量、地理位置等特征,为客户提供房价的初步预估。

(二)决策树与随机森林:电商用户购买行为预测

决策树通过对特征进行划分来构建树形结构,每个内部节点表示一个特征上的测试,分支表示测试输出,叶节点表示类别。随机森林则是集成多个决策树,通过投票或平均等方式进行预测,提升了模型的稳定性和泛化能力。在电商领域,预测用户的购买行为对精准营销至关重要,许多大型电商平台都在运用这些模型来分析用户数据,提高营销效果。

1. 原理简述:决策树基于信息增益、基尼指数等准则进行特征选择和节点分裂;随机森林在构建决策树时,对样本和特征进行随机抽样,减少过拟合。

2. Sklearn实现:

from sklearn.tree import DecisionTreeClassifier

from sklearn.ensemble import RandomForestClassifier

from sklearn.datasets import make_classification

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

# 生成模拟电商用户购买行为数据集(特征和是否购买的标签)

X, y = make_classification(n_samples=1000, n_features=10, 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)

# 训练决策树模型

dt_model = DecisionTreeClassifier(random_state=42)

dt_model.fit(X_train, y_train)

dt_y_pred = dt_model.predict(X_test)

dt_accuracy = accuracy_score(y_test, dt_y_pred)

print(f"决策树准确率: {dt_accuracy}")

# 训练随机森林模型

rf_model = RandomForestClassifier(n_estimators=100, random_state=42)

rf_model.fit(X_train, y_train)

rf_y_pred = rf_model.predict(X_test)

rf_accuracy = accuracy_score(y_test, rf_y_pred)

print(f"随机森林准确率: {rf_accuracy}")

在这个模拟案例中,通过对比决策树和随机森林对用户购买行为预测的准确率,可以看到随机森林通常具有更好的性能。电商平台可以利用这些模型,根据用户的浏览历史、购买记录、停留时间等特征,预测用户是否会购买某类商品,从而向用户精准推送相关商品和优惠信息,提高用户的购买转化率。

(三)支持向量机:图像识别案例

支持向量机旨在寻找一个最优分类超平面,将不同类别的数据点分开,对于线性不可分的数据,可通过核函数将其映射到高维空间使其线性可分。在图像识别领域,支持向量机被广泛应用于图像分类任务,如人脸识别、手写数字识别等。许多安防系统中的人脸识别功能以及手写数字输入设备背后,都可能有支持向量机的技术支撑。

1. 原理简述:最大化分类间隔,使不同类别的样本点到超平面的距离尽可能大。核函数(如线性核、高斯核等)用于处理非线性分类问题。

2. Sklearn实现:以手写数字识别为例

from sklearn.svm import SVC

from sklearn.datasets import load_digits

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

# 加载手写数字数据集

digits = load_digits

X = digits.data

y = digits.target

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练支持向量机模型(使用高斯核)

svm_model = SVC(kernel='rbf', random_state=42)

svm_model.fit(X_train, y_train)

svm_y_pred = svm_model.predict(X_test)

svm_accuracy = accuracy_score(y_test, svm_y_pred)

print(f"支持向量机准确率: {svm_accuracy}")

通过上述代码,利用支持向量机对手写数字进行分类识别,并计算模型的准确率。在实际的手写数字识别应用中,如银行处理支票上的手写数字、邮政系统识别邮政编码等场景,高准确率的支持向量机模型能够快速准确地识别出手写数字,提高业务处理效率。

1. 原理:将数据集划分为多个子集,每次使用其中一个子集作为测试集,其余子集作为训练集,多次训练和评估模型,最后将评估结果平均,以得到更可靠的模型性能评估。常见的交叉验证方式有K折交叉验证、留一法交叉验证等。

2. Sklearn实现:以K折交叉验证(KFold)为例,对线性回归模型进行评估:

from sklearn.linear_model import LinearRegression

from sklearn.datasets import fetch_california_housing

from sklearn.model_selection import KFold, cross_val_score

import numpy as np

# 加载数据集

housing = fetch_california_housing

X = housing.data

y = housing.target

# 创建K折交叉验证器,设置折数为5

kf = KFold(n_splits=5, shuffle=True, random_state=42)

# 初始化线性回归模型

model = LinearRegression

# 进行交叉验证并计算得分(这里使用负均方误差,因为cross_val_score默认越大越好)

scores = cross_val_score(model, X, y, cv=kf, scoring='neg_mean_squared_error')

print(f"5折交叉验证的负均方误差得分: {scores}")

print(f"平均负均方误差: {np.mean(scores)}")

(二)网格搜索

1. 原理:通过穷举超参数的不同组合,训练并评估模型,找到使模型性能最优的超参数组合。例如对于随机森林,超参数可能包括树的数量(n_estimators)、最大深度(max_depth)等。

2. Sklearn实现:使用GridSearchcv对随机森林的超参数进行搜索:

from sklearn.ensemble import RandomForestClassifier

from sklearn.datasets import make_classification

from sklearn.model_selection import GridSearchCV, train_test_split

from sklearn.metrics import accuracy_score

# 生成模拟数据集

X, y = make_classification(n_samples=1000, n_features=10, 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)

# 定义随机森林模型

rf = RandomForestClassifier(random_state=42)

# 定义超参数搜索空间

param_grid = {

'n_estimators': [50, 100, 200],

'max_depth': [3, 5, 7]

}

# 使用GridSearchCV进行超参数搜索,设置5折交叉验证

grid_search = GridSearchCV(rf, param_grid, cv=5)

grid_search.fit(X_train, y_train)

# 输出最优超参数和最优得分

print(f"最优超参数: {grid_search.best_params_}")

print(f"最优得分: {grid_search.best_score_}")

# 使用最优模型进行预测

best_model = grid_search.best_estimator_

y_pred = best_model.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)

print(f"测试集准确率: {accuracy}")

(一)特征选择

1. 过滤法 - SelectKBest:根据特征的统计量(如卡方检验、信息增益等)对特征进行评分,选择得分最高的K个特征。例如在文本分类任务中,使用卡方检验选择与类别相关性最强的K个词作为特征 。

from sklearn.datasets import fetch_20newsgroups

from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.feature_selection import SelectKBest, chi2

from sklearn.model_selection import train_test_split

from sklearn.naive_bayes import MultinomialNB

from sklearn.metrics import accuracy_score

# 加载20新闻组数据集

news = fetch_20newsgroups(subset='all')

X = news.data

y = news.target

# 使用TF - IDF将文本转换为数值特征

vectorizer = TfidfVectorizer

X_vectorized = vectorizer.fit_transform(X)

# 使用SelectKBest和卡方检验选择前1000个特征

selector = SelectKBest(score_func=chi2, k=1000)

X_selected = selector.fit_transform(X_vectorized, y)

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.2, random_state=42)

# 使用朴素贝叶斯模型进行分类

model = MultinomialNB

model.fit(X_train, y_train)

y_pred = model.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)

print(f"选择特征后的准确率: {accuracy}")

2. 包装法 - RFE:递归特征消除法,通过训练模型,每次消除权重最低的特征,直到达到指定的特征数量。例如在预测股票价格走势时,使用RFE选择对预测结果影响最大的几个技术指标作为特征。

from sklearn.linear_model import LinearRegression

from sklearn.datasets import make_regression

from sklearn.feature_selection import RFE

from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_squared_error

# 生成模拟回归数据集

X, y = make_regression(n_samples=1000, n_features=20, noise=0.1, random_state=42)

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化线性回归模型

model = LinearRegression

# 使用RFE选择前10个特征

rfe = RFE(model, n_features_to_select=10)

X_train_selected = rfe.fit_transform(X_train, y_train)

X_test_selected = rfe.transform(X_test)

# 训练模型并评估

model.fit(X_train_selected, y_train)

y_pred = model.predict(X_test_selected)

mse = mean_squared_error(y_test, y_pred)

print(f"选择特征后的均方误差: {mse}")

(二)特征缩放

1. 标准化(StandardScaler):将数据转换为均值为0,标准差为1的分布。在K近邻算法中,由于距离计算对特征尺度敏感,通常需要对数据进行标准化处理,以避免某些特征的尺度影响模型性能。

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.neighbors import KNeighborsClassifier

from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集

iris = load_iris

X = iris.data

y = iris.target

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 标准化处理

scaler = StandardScaler

X_train_scaled = scaler.fit_transform(X_train)

X_test_scaled = scaler.transform(X_test)

# 使用K近邻模型进行分类

model = KNeighborsClassifier(n_neighbors=5)

model.fit(X_train_scaled, y_train)

y_pred = model.predict(X_test_scaled)

accuracy = accuracy_score(y_test, y_pred)

print(f"标准化后的准确率: {accuracy}")

2. 归一化(MinMaxScaler):将数据缩放到指定的范围,通常是[0, 1]。在神经网络训练中,归一化可以使数据处于合适的范围,有助于加速模型收敛。

from sklearn.datasets import load_digits

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import MinMaxScaler

from sklearn.neural_network import MLPClassifier

from sklearn.metrics import accuracy_score

# 加载手写数字数据集

digits = load_digits

X = digits.data

y = digits.target

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 归一化处理

scaler = MinMaxScaler

X_train_scaled = scaler.fit_transform(X_train)

X_test_scaled = scaler.transform(X_test)

# 使用多层感知机模型进行分类

model = MLPClassifier(hidden_layer_sizes=(100,), max_iter=1000, random_state=42)

model.fit(X_train_scaled, y_train)

y_pred = model.predict(X_test_scaled)

accuracy = accuracy_score(y_test, y_pred)

print(f"归一化后的准确率: {accuracy}")

通过以上中级教程的学习,你已经深入了解了Sklearn中各种机器学习算法的应用、模型评估与调优方法以及强大的特征工程技巧,并通过实际的爆款案例掌握了如何在不同场景下解决问题。未来,你可以进一步探索更复杂的模型集成方法、深度学习与Sklearn的结合应用,以及在大规模数据集上的分布式计算等高级内容,不断提升自己在机器学习领域的能力,为解决现实世界中的各种复杂问题提供更有效的解决方案。

来源:绿叶菜

相关推荐