Python 课程13-机器学习
前言
数据科学 和 机器学习 涉及从原始数据的处理到模型的构建与评估,是一套完整的流程。在这一过程中,Python 提供了许多强大的工具和库,如 Pandas、NumPy、Matplotlib、Seaborn、以及最重要的机器学习库 scikit-learn。这些工具可以帮助我们完成从数据清洗、特征选择、模型训练到评估的全过程。
本教程将提供每个指令的详细说明,并辅以代码示例。目标是让你对整个数据科学与机器学习的流程有深刻的理解,并能在实际项目中熟练应用这些知识。
目录
-
Pandas:数据处理与清洗
- 数据导入与导出
- 数据查看与筛选
- 缺失值处理
- 重复值处理
- 数据标准化与归一化
- 数据分组与聚合
-
NumPy:数值运算
- 数组的创建与操作
- 数组的广播机制
- 基本的矩阵运算
- 随机数生成
-
Matplotlib 与 Seaborn:数据可视化
- 绘制折线图、柱状图、散点图与直方图
- 自定义图表(标题、标签、颜色等)
- 使用 Seaborn 绘制热力图与分布图
-
scikit-learn:机器学习基础
- 数据集拆分:训练集与测试集
- 监督学习:线性回归与分类
- 非监督学习:K-Means 聚类
- 模型评估:交叉验证与性能指标
1. Pandas:数据处理与清洗
数据导入与导出
Pandas 是一个强大的数据处理库。我们通常会通过 Pandas 读取 CSV、Excel 或其他格式的数据文件,并将其存储为 DataFrame 对象。
- 读取 CSV 文件:
import pandas as pd # 读取 CSV 文件 df = pd.read_csv('data.csv') # 查看数据前 5 行 print(df.head())
保存 DataFrame 为 CSV 文件:
df.to_csv('output.csv', index=False)
数据查看与筛选
- 查看数据概况:
# 查看数据的基本信息(数据类型、非空值等) print(df.info()) # 查看数据的统计信息(均值、标准差等) print(df.describe()) # 查看前几行数据 print(df.head(10))
筛选特定列与行:
# 筛选特定列 df_subset = df[['Name', 'Age']] # 筛选特定行(年龄大于 30) df_filtered = df[df['Age'] > 30]
缺失值处理
现实世界中的数据常常包含缺失值,Pandas 提供了简单的方法来处理这些缺失值。
- 检查缺失值:
# 检查每一列的缺失值数量 print(df.isnull().sum())
- 填充缺失值:
# 用平均值填充缺失值 df['Age'].fillna(df['Age'].mean(), inplace=True)
- 删除包含缺失值的行:
# 删除包含任何缺失值的行 df_cleaned = df.dropna()
重复值处理
- 检查与删除重复值:
# 检查重复值 print(df.duplicated()) # 删除重复值 df_cleaned = df.drop_duplicates()
数据标准化与归一化
标准化 和 归一化 是将数据转化为统一范围或分布的常用方法,尤其在机器学习中,标准化和归一化是非常重要的步骤。
- 标准化:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() df[['Age', 'Salary']] = scaler.fit_transform(df[['Age', 'Salary']])
- 归一化:
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() df[['Age', 'Salary']] = scaler.fit_transform(df[['Age', 'Salary']])
数据分组与聚合
- 按特定列分组并计算聚合结果:
# 按 'Gender' 列分组,并计算每组的平均工资 df_grouped = df.groupby('Gender')['Salary'].mean() print(df_grouped)
2. NumPy:数值运算
NumPy 是 Python 中用于科学计算的核心库。它提供了强大的数组对象和一系列高效的数值计算功能。
数组的创建与操作
- 创建数组:
import numpy as np # 创建一维数组 arr = np.array([1, 2, 3, 4, 5]) # 创建二维数组 arr_2d = np.array([[1, 2, 3], [4, 5, 6]]) # 创建全零数组 zeros_arr = np.zeros((3, 3)) # 创建全一数组 ones_arr = np.ones((2, 4))
- 数组切片与索引:
# 访问数组中的元素 print(arr[0]) # 输出第一个元素 # 访问二维数组中的特定行与列 print(arr_2d[1, 2]) # 输出第二行第三列的元素 # 数组切片 print(arr[:3]) # 输出前 3 个元素
数组的广播机制
广播机制 是 NumPy 中的一个强大特性,允许不同形状的数组进行数学运算。
arr1 = np.array([1, 2, 3]) arr2 = np.array([[10], [20], [30]]) # 广播机制将 arr1 复制为 3x3 的数组,并与 arr2 相加 result = arr1 + arr2 print(result)
基本的矩阵运算
- 矩阵相乘:
arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([[5, 6], [7, 8]]) # 矩阵乘法 result = np.dot(arr1, arr2) print(result)
随机数生成
- 生成随机数数组:
# 生成 0 到 1 之间的随机数 rand_arr = np.random.rand(3, 3) # 生成正态分布的随机数 randn_arr = np.random.randn(2, 2)
3. Matplotlib 与 Seaborn:数据可视化
数据可视化是数据分析的重要组成部分,通过图表能够直观地展示数据的趋势与分布。
绘制折线图、柱状图、散点图与直方图
Matplotlib 是 Python 中最常用的绘图库,而 Seaborn 是基于 Matplotlib 的高级可视化库,提供了更美观的默认样式。
- 绘制折线图:
import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [10, 15, 13, 18, 16] plt.plot(x, y) plt.title("Line Plot Example") plt.xlabel("X Axis") plt.ylabel("Y Axis") plt.show()
- 绘制柱状图:
categories = ['A', 'B', 'C', 'D'] values = [5, 7, 3, 8] plt.bar(categories, values) plt.title("Bar Plot Example") plt.xlabel("Category") plt.ylabel("Value") plt.show()
- 绘制散点图:
import numpy as np x = np.random.rand(50) y = np.random.rand(50) plt.scatter(x, y) plt.title("Scatter Plot Example") plt.xlabel("X Axis") plt.ylabel("Y Axis") plt.show()
- 绘制直方图:
data = np.random.randn(1000) plt.hist(data, bins=30, alpha=0.5) plt.title("Histogram Example") plt.xlabel("Value") plt.ylabel("Frequency") plt.show()
使用 Seaborn 绘制热力图与分布图
- 绘制热力图:
import seaborn as sns # 创建相关矩阵的热力图 corr = df.corr() sns.heatmap(corr, annot=True, cmap='coolwarm') plt.title("Heatmap Example") plt.show()
- 绘制分布图:
sns.histplot(df['Age'], kde=True) plt.title('Age Distribution') plt.show()
-
4. scikit-learn:机器学习基础
scikit-learn 是 Python 中最常用的机器学习库之一,提供了各种常见的机器学习算法、数据集处理工具、模型评估方法等。通过 scikit-learn,你可以快速构建监督学习和非监督学习模型。
数据集拆分:训练集与测试集
在训练机器学习模型之前,通常会将数据集拆分为 训练集 和 测试集。训练集用于训练模型,而测试集用于评估模型的性能。
- 使用
train_test_split
进行数据集拆分:from sklearn.model_selection import train_test_split # 假设我们有特征数据 X 和标签 y X = df[['Age', 'Salary']] # 特征 y = df['HighSalary'] # 标签 # 使用 80% 的数据作为训练集,20% 作为测试集 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 LinearRegression # 创建线性回归模型 model = LinearRegression() # 训练模型 model.fit(X_train, y_train) # 使用训练好的模型进行预测 predictions = model.predict(X_test) # 查看模型系数 print("Coefficients:", model.coef_) print("Intercept:", model.intercept_)
分类算法(决策树)
分类算法用于预测离散的类别标签。例如,我们可以通过决策树算法预测一个人是否收入高于某个值。
- 决策树分类器示例:
from sklearn.tree import DecisionTreeClassifier # 假设我们有一个分类标签 df['HighSalary'] = df['Salary'] > 50000 # 训练决策树分类器 X = df[['Age', 'Salary']] y = df['HighSalary'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) clf = DecisionTreeClassifier() clf.fit(X_train, y_train) # 预测 predictions = clf.predict(X_test) print("Predictions:", predictions)
非监督学习:K-Means 聚类
非监督学习是一种没有标签的数据学习方法,常用于数据聚类、降维等。常用的非监督学习算法包括 K-Means 聚类。
K-Means 聚类
K-Means 聚类用于将数据分成 k 个不同的簇。每个数据点被分配到离它最近的簇中心。
- K-Means 聚类示例:
from sklearn.cluster import KMeans # 使用 K-Means 进行聚类 kmeans = KMeans(n_clusters=3) kmeans.fit(X) # 获取聚类标签 df['Cluster'] = kmeans.labels_ # 可视化聚类结果 import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) sns.scatterplot(x='Age', y='Salary', hue='Cluster', data=df, palette='Set1') plt.title('K-Means Clustering') plt.show()
机器学习模型评估
模型评估是机器学习中至关重要的一步,用于评估模型在新数据上的表现。常见的评估方法有准确率(分类问题)和均方误差(回归问题)。
分类模型的评估:准确率
- 使用
accuracy_score
评估分类模型:from sklearn.metrics import accuracy_score # 对于分类模型,使用准确率进行评估 accuracy = accuracy_score(y_test, predictions) print(f"Accuracy: {accuracy:.2f}")
回归模型的评估:均方误差
- 使用
mean_squared_error
评估回归模型:from sklearn.metrics import mean_squared_error # 对于回归模型,使用均方误差进行评估 mse = mean_squared_error(y_test, predictions) print(f"Mean Squared Error: {mse:.2f}")
交叉验证
交叉验证是一种评估模型性能的技术,通常通过将数据分为多个子集,多次训练和测试模型,避免过拟合。
- 使用
cross_val_score
进行交叉验证:from sklearn.model_selection import cross_val_score # 进行 5 折交叉验证 scores = cross_val_score(model, X, y, cv=5) # 输出每次验证的得分 print("Cross-validation scores:", scores) # 输出平均得分 print("Average score:", scores.mean())
示例:构建一个完整的机器学习项目
让我们通过一个完整的示例,展示如何使用 scikit-learn 进行一个完整的机器学习流程。
任务:预测波士顿房价
我们使用 scikit-learn 中的 波士顿房价数据集,通过线性回归模型预测房价。
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # 加载波士顿房价数据集 boston = load_boston() X = boston.data y = boston.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) # 进行预测 predictions = model.predict(X_test) # 评估模型 mse = mean_squared_error(y_test, predictions) print(f"Mean Squared Error: {mse:.2f}")
在这个项目中,我们使用了 波士顿房价数据集,通过 线性回归模型 进行房价预测,并使用 均方误差 来评估模型的性能。
结论
通过本教程,你已经学习了如何使用 Python 中的各个工具库进行数据处理、可视化和机器学习。我们从基础的 Pandas 数据处理和 NumPy 数值计算开始,逐步深入到 Matplotlib 和 Seaborn 的数据可视化,最后详细介绍了 scikit-learn 中常用的机器学习算法及其应用。
- Pandas 和 NumPy 为你提供了强大的数据处理和数值运算能力。
- Matplotlib 和 Seaborn 帮助你快速生成各种图表,直观展示数据。
- scikit-learn 则让你能够轻松构建、训练和评估机器学习模型。