【机器学习】Python中sklearn中数据基础处理与分析过程

📝个人主页:哈__

期待您的关注

目录

[1. 简介](#1. 简介)

​编辑

[1.1 什么是Scikit-learn](#1.1 什么是Scikit-learn)

介绍Scikit-learn

应用领域

[1.2 安装Scikit-learn](#1.2 安装Scikit-learn)

安装步骤

必要的依赖

[2. 数据处理](#2. 数据处理)

[2.1 创建示例数据](#2.1 创建示例数据)

[2.2 数据预处理](#2.2 数据预处理)

处理缺失值

特征编码

特征缩放

[3. 数据集划分](#3. 数据集划分)

[3.1 划分数据集](#3.1 划分数据集)

[4. 模型训练与评估](#4. 模型训练与评估)

[4.1 选择模型](#4.1 选择模型)

[4.2 训练和评估模型](#4.2 训练和评估模型)

逻辑回归

支持向量机

决策树

K近邻

[5. 进阶内容](#5. 进阶内容)

[5.1 网格搜索与超参数调优](#5.1 网格搜索与超参数调优)

[5.2 交叉验证](#5.2 交叉验证)


1. 简介

1.1 什么是Scikit-learn

介绍Scikit-learn

Scikit-learn(简称sklearn)是一个基于Python的机器学习库,构建在NumPy、SciPy和Matplotlib之上。它提供了简单而高效的工具来进行数据挖掘和数据分析,适用于各种机器学习任务。

主要特点:

  • 简单且高效:提供了大量的机器学习算法,具有一致的API接口,易于上手。
  • 广泛的算法覆盖:支持分类、回归、聚类、降维、模型选择和预处理等多种任务。
  • 高性能:借助于NumPy和SciPy的数值计算优势,保证了较高的计算效率。
  • 开源社区支持:拥有活跃的社区,提供了丰富的文档和示例代码。

应用领域

Scikit-learn在以下领域有广泛应用:

  • 分类:识别图片中的对象、垃圾邮件过滤、语音识别等。
  • 回归:预测房价、股票市场预测、气象预报等。
  • 聚类:客户细分、文档分类、图像分割等。
  • 降维:数据可视化、特征压缩、噪声过滤等。
  • 模型选择:通过交叉验证选择最佳模型和参数。

1.2 安装Scikit-learn

安装步骤

安装Scikit-learn非常简单,可以通过Python的包管理工具pip来完成。打开终端或命令提示符,运行以下命令:

python 复制代码
pip install scikit-learn

如果你还没有安装pip,可以先安装pip:

python 复制代码
# 对于Windows
python -m ensurepip --default-pip

# 对于macOS/Linux
python3 -m ensurepip --default-pip

必要的依赖

Scikit-learn依赖于以下Python库:

  • NumPy:支持高性能的数组运算。
  • SciPy:提供了许多用于科学计算的工具和算法。
  • joblib:用于在多个处理器上并行计算。
  • Matplotlib(可选):用于数据可视化。

在安装Scikit-learn时,这些依赖会自动安装。如果需要手动安装,可以运行以下命令:

python 复制代码
pip install numpy scipy joblib matplotlib

2. 数据处理

在机器学习中,数据处理是至关重要的步骤之一。在本节中,我们将讨论如何导入、预处理数据,以确保数据质量和一致性,从而为机器学习模型的训练打下坚实基础。这里我们没有使用csv的方式,而是直接创建了数据。

2.1 创建示例数据

首先,我们将创建一个示例数据集,并使用Pandas库来管理数据。Pandas是一个强大的数据分析和处理工具,它提供了易用的数据结构和数据分析功能。

python 复制代码
import pandas as pd
import numpy as np


data = {
    'age': [25, 30, 35, np.nan, 40, 22, 28, 45, 50, np.nan, 32, 38, 29, 27, np.nan, 26, 31, 34, 48, 37],
    'salary': [50000, 60000, 70000, 80000, np.nan, 45000, 58000, 65000, 72000, 68000, 75000, 64000, 52000, 50000, 60000, 55000, 61000, 67000, 73000, np.nan],
    'purchased': ['No', 'Yes', 'No', 'Yes', 'No', 'No', 'Yes', 'No', 'Yes', 'No', 'Yes', 'No', 'Yes', 'No', 'Yes', 'No', 'Yes', 'No', 'Yes', 'No']
}

df = pd.DataFrame(data)
print("原始数据集:")
print(df.to_string(index=False))

上述代码创建了一个包含年龄(age)、薪资(salary)和是否购买(purchased)三列的示例数据集。此数据集中存在一些缺失值和分类数据。

2.2 数据预处理

处理缺失值

在数据分析和机器学习中,处理缺失值是常见的步骤。我们将使用Scikit-learn的SimpleImputer类来填补缺失值。这里我们选择使用均值来填补数值型特征的缺失值。

python 复制代码
from sklearn.impute import SimpleImputer

# 创建一个SimpleImputer实例,用于填补缺失值
imputer = SimpleImputer(strategy='mean')

# 选择需要填补缺失值的列
columns_to_impute = ['age', 'salary']

# 填补缺失值
df[columns_to_impute] = imputer.fit_transform(df[columns_to_impute])

print("填补缺失值后的数据集:")
print(df)

在上述代码中,我们使用SimpleImputer将age和salary列中的缺失值填补为该列的均值。

特征编码

在机器学习模型中,我们通常需要将分类数据转换为数值数据。这里我们使用Scikit-learn的LabelEncoder来将purchased列中的分类数据(Yes和No)转换为数值数据(1和0)。

python 复制代码
from sklearn.preprocessing import LabelEncoder

# 创建一个LabelEncoder实例
label_encoder = LabelEncoder()

# 将'Yes'/'No'转换为0和1
df['purchased'] = label_encoder.fit_transform(df['purchased'])

print("编码后的数据集:")
print(df)

特征缩放

特征缩放是数据预处理的重要步骤,尤其是在特征具有不同量纲时。我们使用Scikit-learn的StandardScaler来标准化age和salary列。

python 复制代码
from sklearn.preprocessing import StandardScaler

# 创建一个StandardScaler实例
scaler = StandardScaler()

# 选择需要缩放的列
columns_to_scale = ['age', 'salary']

# 缩放特征
df[columns_to_scale] = scaler.fit_transform(df[columns_to_scale])

print("缩放后的数据集:")
print(df)

在上述代码中,我们使用StandardScaler将age和salary列标准化,使其均值为0,标准差为1,从而保证各特征在同一尺度上。

通过上述步骤,我们成功地创建并预处理了一个示例数据集。这些预处理步骤包括处理缺失值、编码分类数据和特征缩放,是机器学习项目中的重要环节,能够显著提高模型的性能和准确性。

3. 数据集划分

数据集划分是机器学习中至关重要的一步。通常,我们将数据集划分为训练集和测试集,用于模型的训练和评估。Scikit-learn提供了一个方便的函数train_test_split,可以轻松地将数据集按指定比例划分。

3.1 划分数据集

我们将使用Scikit-learn的train_test_split函数将数据集划分为训练集和测试集。通常,我们会选择70%-80%的数据用于训练,其余用于测试。

python 复制代码
from sklearn.model_selection import train_test_split

X = df[['age', 'salary']]
y = df['purchased']

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

print("训练集特征:")
print(X_train.to_string(index=False))
print("\n测试集特征:")
print(X_test.to_string(index=False))
print("\n训练集目标:")
print(y_train.to_string(index=False))
print("\n测试集目标:")
print(y_test.to_string(index=False))

在上述代码中,我们将数据集按70%用于训练,30%用于测试。训练集和测试集的划分使我们可以使用训练集来训练模型,并使用测试集来评估模型的性能,从而确保模型的泛化能力。

4. 模型训练与评估

4.1 选择模型

在本教程中,我们将使用几种常见的分类模型来进行分类任务。这些模型包括:

  • 逻辑回归(Logistic Regression)
  • 支持向量机(Support Vector Machine, SVM)
  • 决策树(Decision Tree)
  • 随机森林(Random Forest)
  • K近邻(K-Nearest Neighbors, KNN)

4.2 训练和评估模型

我们将分别训练和评估这些模型,展示每个模型的性能。

逻辑回归

python 复制代码
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# 创建逻辑回归模型
model_lr = LogisticRegression()

# 使用训练集训练模型
model_lr.fit(X_train, y_train)

# 预测测试集结果
y_pred_lr = model_lr.predict(X_test)

# 评估模型
accuracy_lr = accuracy_score(y_test, y_pred_lr)
conf_matrix_lr = confusion_matrix(y_test, y_pred_lr)
class_report_lr = classification_report(y_test, y_pred_lr)

print("逻辑回归模型评估:")
print(f"准确率:{accuracy_lr:.2f}")
print("混淆矩阵:")
print(conf_matrix_lr)
print("分类报告:")
print(class_report_lr)

支持向量机

python 复制代码
from sklearn.svm import SVC

# 创建支持向量机模型
model_svc = SVC()

# 使用训练集训练模型
model_svc.fit(X_train, y_train)

# 预测测试集结果
y_pred_svc = model_svc.predict(X_test)

# 评估模型
accuracy_svc = accuracy_score(y_test, y_pred_svc)
conf_matrix_svc = confusion_matrix(y_test, y_pred_svc)
class_report_svc = classification_report(y_test, y_pred_svc)

print("支持向量机模型评估:")
print(f"准确率:{accuracy_svc:.2f}")
print("混淆矩阵:")
print(conf_matrix_svc)
print("分类报告:")
print(class_report_svc)

决策树

python 复制代码
from sklearn.tree import DecisionTreeClassifier

# 创建决策树模型
model_dt = DecisionTreeClassifier()

# 使用训练集训练模型
model_dt.fit(X_train, y_train)

# 预测测试集结果
y_pred_dt = model_dt.predict(X_test)

# 评估模型
accuracy_dt = accuracy_score(y_test, y_pred_dt)
conf_matrix_dt = confusion_matrix(y_test, y_pred_dt)
class_report_dt = classification_report(y_test, y_pred_dt)

print("决策树模型评估:")
print(f"准确率:{accuracy_dt:.2f}")
print("混淆矩阵:")
print(conf_matrix_dt)
print("分类报告:")
print(class_report_dt)

K近邻

python 复制代码
from sklearn.neighbors import KNeighborsClassifier

# 创建K近邻模型
model_knn = KNeighborsClassifier()

# 使用训练集训练模型
model_knn.fit(X_train, y_train)

# 预测测试集结果
y_pred_knn = model_knn.predict(X_test)

# 评估模型
accuracy_knn = accuracy_score(y_test, y_pred_knn)
conf_matrix_knn = confusion_matrix(y_test, y_pred_knn)
class_report_knn = classification_report(y_test, y_pred_knn)

print("K近邻模型评估:")
print(f"准确率:{accuracy_knn:.2f}")
print("混淆矩阵:")
print(conf_matrix_knn)
print("分类报告:")
print(class_report_knn)

通过这些示例,我们展示了如何使用不同的机器学习模型来解决分类问题,并评估每个模型的性能。这些模型在不同的应用场景下各有优势,选择适合的模型可以显著提升预测的准确性和可靠性。

5. 进阶内容

在机器学习中,优化模型的性能和可靠性是关键的一步。下面我们将介绍两种常用的进阶技术:网格搜索与超参数调优,以及交叉验证。

5.1 网格搜索与超参数调优

超参数调优是提高模型性能的一个重要步骤。超参数是模型训练前设定的参数,不能从数据中直接估计。Scikit-learn提供了GridSearchCV,一个强大的工具来进行超参数调优。

我们将以随机森林模型为例,展示如何使用网格搜索来优化超参数。

python 复制代码
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV

# 定义超参数网格
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [None, 10, 20, 30],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4]
}

# 创建随机森林模型
model_rf = RandomForestClassifier()

# 创建网格搜索对象
grid_search = GridSearchCV(estimator=model_rf, param_grid=param_grid, cv=5, scoring='accuracy', n_jobs=-1)

# 执行网格搜索
grid_search.fit(X_train, y_train)

# 获取最佳参数
best_params = grid_search.best_params_
best_score = grid_search.best_score_

print(f"最佳参数:{best_params}")
print(f"最佳交叉验证准确率:{best_score:.2f}")

在上面的代码中,我们定义了一个参数网格,包含了多个可能的参数组合。GridSearchCV将遍历这些组合,使用交叉验证来评估每个组合的性能,并返回最佳的参数组合。

5.2 交叉验证

交叉验证是一种评估模型性能的技术,通过将数据集分成多个子集,分别用于训练和测试。常用的交叉验证方法是k折交叉验证(k-fold cross-validation),其中数据集被分成k个子集,每个子集轮流作为测试集,其余子集用于训练。

我们可以使用Scikit-learn的cross_val_score函数来进行k折交叉验证。

python 复制代码
from sklearn.model_selection import cross_val_score

# 创建随机森林模型
model_rf = RandomForestClassifier(n_estimators=100, max_depth=20, min_samples_split=2, min_samples_leaf=1)

# 进行5折交叉验证
cv_scores = cross_val_score(model_rf, X, y, cv=5, scoring='accuracy')

print(f"交叉验证准确率:{cv_scores}")
print(f"平均交叉验证准确率:{cv_scores.mean():.2f}")

在上述代码中,我们使用5折交叉验证来评估随机森林模型的性能。cross_val_score函数返回每折交叉验证的准确率,我们还计算了平均交叉验证准确率。

通过这些进阶技术,我们可以更好地优化和评估模型,从而提高模型的泛化能力和预测性能。这些步骤在实际机器学习项目中非常重要,可以显著提升最终模型的效果。

相关推荐
无水先生1 分钟前
高斯过程的数学理解
人工智能·算法·机器学习
m0_5831059032 分钟前
基于flask的闪现、g对象、蓝图
后端·python·flask
eclipsercp33 分钟前
《每天5分钟用Flask搭建一个管理系统》 第6章:数据库集成
数据库·python·flask
小oo呆35 分钟前
【PythonWeb开发】Flask自定义模板路径和静态资源路径
python·flask
Purepisces38 分钟前
深度学习笔记: 最详尽解释预测系统的分类指标(精确率、召回率和 F1 值)
人工智能·笔记·python·深度学习·机器学习·分类
铁匠匠匠1 小时前
django学习入门系列之第三点《案例 小米商城二级菜单》
前端·css·经验分享·python·学习·django·前端框架
Jurio.1 小时前
【ACM出版】第13届亚洲膜计算会议(ACMC2024)暨 2024年机器学习、模式识别与自动化工程国际学术会议(MLPRAE 2024,8月7日-9)
运维·机器学习·自动化·国际会议·模式识别·膜计算
coolkidlan1 小时前
【AI原理解析】—k-means原理
人工智能·机器学习·kmeans
jiayoushijie-泽宣1 小时前
深入浅出3D感知中的优化与基于学习的技术 (第二章) 原创教程
人工智能·学习·算法·机器学习·3d·机器人
Ephemeroptera1 小时前
IT专业入门,高考假期预习指南
java·c语言·网络·python·高考