【针对路面识别数据集,结合三轴加速度标准化数据及多路面识别需求,以下是算法选择与处理方案】

目录

一、算法选择建议

[1. 首选推荐:XGBoost / 随机森林](#1. 首选推荐:XGBoost / 随机森林)

[2. 次选推荐:支持向量机(SVM)](#2. 次选推荐:支持向量机(SVM))

[3. 谨慎使用:逻辑回归 / 朴素贝叶斯](#3. 谨慎使用:逻辑回归 / 朴素贝叶斯)

[4. 进阶选择:神经网络(CNN/LSTM)](#4. 进阶选择:神经网络(CNN/LSTM))

二、多路面识别方案

[1. 多分类建模](#1. 多分类建模)

[2. 特征工程增强](#2. 特征工程增强)

[3. 数据预处理优化](#3. 数据预处理优化)

[4. 模型评估与调优](#4. 模型评估与调优)

三、其他适合传感器数据的算法

四、实施建议

五、具体数据处理

六、模型训练

1.先装xgboost

2.模型训练

[️ 3.📊 两段代码的改进点总结](#️ 3.📊 两段代码的改进点总结)

[4.🚀 如何再精进?预测准确率突破 80% 的方案](#4.🚀 如何再精进?预测准确率突破 80% 的方案)

[1. 引入频域特征 (最推荐 🔥)](#1. 引入频域特征 (最推荐 🔥))

[2. 优化 XGBoost 超参数](#2. 优化 XGBoost 超参数)

[3. 解决类别不平衡](#3. 解决类别不平衡)


一、算法选择建议

1. 首选推荐:XGBoost / 随机森林
  • 优势:对高维特征和非线性关系处理能力强,能自动捕捉加速度信号中的复杂模式(如湿滑路面的高频抖动、沥青路面的平稳波动)。
  • 适用场景:数据量中等(几千到几万条样本),需要高精度且可解释性强的模型。
  • 注意事项:需进行特征工程(如提取均值、方差、频域能量等),避免直接输入原始时序数据导致过拟合。
2. 次选推荐:支持向量机(SVM)
  • 优势:在小样本场景下表现优异,通过核函数(如 RBF)可有效处理非线性分类。
  • 适用场景:数据量较小(<5000 条),或类别间边界清晰(如干燥 vs. 湿滑)。
  • 局限性:计算复杂度随样本量增长较快,不适合大规模数据。
3. 谨慎使用:逻辑回归 / 朴素贝叶斯
  • 逻辑回归:仅适用于线性可分问题,而路面振动信号通常高度非线性,效果可能较差。
  • 朴素贝叶斯:假设特征独立,但三轴加速度数据存在强相关性(如 X/Y/Z 轴的耦合振动),可能违反假设导致性能下降。
4. 进阶选择:神经网络(CNN/LSTM)
  • 优势:可直接处理原始时序数据,自动学习深层特征(如 CNN 提取局部振动模式,LSTM 捕捉长时依赖)。
  • 适用场景:数据量大(>1 万条),且有充足算力支持训练。
  • 注意事项:需设计合适的网络结构(如 1D-CNN + LSTM 混合模型),并防止过拟合(使用 Dropout、早停等)。

二、多路面识别方案

若需区分多种路面(如湿滑-11、沥青-12 等),可采用以下策略:

1. 多分类建模
  • 将每个路面类型作为独立类别(如"湿滑-11"=0,"沥青-12"=1),使用多分类算法(XGBoost/SVM/神经网络)直接输出类别标签。
  • 关键步骤:确保训练集覆盖所有路面类型,且各类别样本量均衡。
2. 特征工程增强
  • 从原始三轴加速度数据中提取统计特征(均值、标准差、峰度、偏度)、频域特征(FFT 能量谱)、时域特征(过零率、自相关系数)。
  • 例如:湿滑路面可能在 Z 轴方向有更高的标准差,而沥青路面在 X/Y 轴方向有更平稳的波动。
3. 数据预处理优化
  • 对每个文件的数据进行滑动窗口分割(如每 100 条数据为一个窗口),生成多个样本片段,增加训练数据量。
  • 使用标准化后的数据进行训练,避免不同传感器或路段的量纲差异影响模型。
4. 模型评估与调优
  • 使用交叉验证(如 5 折)评估模型泛化能力,重点关注 Kappa 系数和 F1 分数。
  • 针对不平衡类别(如某些路面样本较少),可使用过采样(SMOTE)或调整类别权重。

三、其他适合传感器数据的算法

  • AdaBoost:通过组合弱分类器提升精度,适合中小规模数据,但需注意过拟合风险。
  • 高斯贝叶斯(GNB):虽假设特征连续且服从正态分布,但若数据经标准化后接近正态分布,可作为基线模型快速验证。
  • LightGBM:XGBoost 的轻量级替代,训练速度更快,适合大数据量场景。

四、实施建议

  • 第一步:先使用 XGBoost 或随机森林作为基线模型,快速验证可行性。
  • 第二步:若精度不足,尝试特征工程优化或引入深度学习模型(如 1D-CNN)。
  • 第三步:对多路面识别任务,确保每个类别至少有数百个有效样本,避免模型偏向多数类。

五、具体数据处理

先将数据集的每份数据进行标准化处理

代码如下:

python 复制代码
import pandas as pd
from sklearn.preprocessing import StandardScaler  # 可选:也可以用sklearn,但手写公式更直观

# 1. 设置文件路径
file_path = '你的数据集.xlsx'

# 2. 读取Excel文件的所有Sheet名称
xls = pd.ExcelFile(file_path)
sheet_names = xls.sheet_names

print(f"检测到以下工作表: {sheet_names}")

# 创建一个ExcelWriter对象,用于写入新数据(避免覆盖原文件导致报错,建议存为新文件或新Sheet)
output_file = '你的数据集_标准化后.xlsx'

with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
    # 3. 遍历每一个工作表
    for sheet in sheet_names:
        print(f"正在处理: {sheet} ...")

        # 读取当前Sheet的数据
        df = pd.read_excel(xls, sheet_name=sheet)

        # 假设数据在 x, y, z 三列中(根据截图推测)
        # 如果第一行是标题,pandas会自动识别;如果不是,需调整header参数

        # --- 方法 A: 使用 Pandas 原生函数 (推荐,简单直接) ---
        # axis=0 表示按列计算均值和标准差
        df_standardized = (df - df.mean()) / df.std()

        # --- 方法 B: 如果你想保留原始数据,只把标准化后的数据存入 ---
        # 这里我们直接替换原数据框的内容

        # 4. 将处理后的数据写入新的Excel文件,保持原来的Sheet名字
        df_standardized.to_excel(writer, sheet_name=sheet, index=False)

print("处理完成!文件已保存为:", output_file)

得到结果是标准化后的数据文件

六、模型训练

数据量在1万到9万条之间,XGBoost 绝对是处理这种体量大小的首选

完整的 XGBoost 路面识别代码

1.先装xgboost
python 复制代码
D:\huaweidata\.venv\Scripts\pip.exe install xgboost seaborn matplotlib
2.模型训练
python 复制代码
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score, confusion_matrix
from sklearn.preprocessing import LabelEncoder
import xgboost as xgb
import seaborn as sns
import matplotlib.pyplot as plt
import warnings

# ================= 全局设置:消除警告与字体问题 =================

# 1. 忽略 XGBoost 的 "use_label_encoder" 弃用警告
warnings.filterwarnings("ignore", category=UserWarning, module="xgboost")

# 2. 解决 Matplotlib 中文显示方块/报错的问题
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'Microsoft YaHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号


# ================= 1. 数据读取与合并 =================
def load_and_merge_data(file_path):
    """读取Excel的所有Sheet并合并"""
    xls = pd.ExcelFile(file_path)
    all_data = []

    print("正在读取数据...")
    for sheet in xls.sheet_names:
        df = pd.read_excel(xls, sheet_name=sheet)
        df.columns = [col.lower() for col in df.columns]
        df['label'] = sheet
        all_data.append(df)

    merged_df = pd.concat(all_data, ignore_index=True)
    print(f"数据合并完成,总样本数: {len(merged_df)}")
    return merged_df


# ================= 2. 特征提取 (滑动窗口) =================
def extract_features(df, window_size=500):
    """将连续的加速度数据按窗口切分,提取统计特征"""
    features = []
    labels = []

    # 按照窗口大小切分数据
    for i in range(0, len(df) - window_size, window_size):
        window = df.iloc[i: i + window_size]

        # 【优化】检查窗口内标签是否一致,防止切到交界处产生噪声
        if window['label'].nunique() > 1:
            continue  # 如果窗口内有多种标签,直接跳过

        row_features = []
        for axis in ['x', 'y', 'z']:
            row_features.extend([
                window[axis].mean(),
                window[axis].std(),
                window[axis].max(),
                window[axis].min()
            ])

        features.append(row_features)
        labels.append(window['label'].iloc[0])

    feature_df = pd.DataFrame(features, columns=[
        'x_mean', 'x_std', 'x_max', 'x_min',
        'y_mean', 'y_std', 'y_max', 'y_min',
        'z_mean', 'z_std', 'z_max', 'z_min'
    ])
    feature_df['label'] = labels
    return feature_df


# ================= 3. 主程序 =================
if __name__ == '__main__':
    # 配置路径
    file_path = r"D:\huaweidata\江淮试验场路面识别数据集_标准化后.xlsx"  # 请确保这里是你实际的文件路径

    # 1. 加载数据
    raw_data = load_and_merge_data(file_path)

    # 2. 提取特征
    window_size = 500
    print(f"开始特征提取 (窗口大小: {window_size})...")
    feature_data = extract_features(raw_data, window_size=window_size)
    print(f"特征提取完成,生成样本数: {len(feature_data)}")

    # 3. 划分特征 (X) 和 标签 (y)
    X = feature_data.drop('label', axis=1)
    y = feature_data['label']

    # 把中文标签转换成数字
    le = LabelEncoder()
    y_encoded = le.fit_transform(y)

    print("标签映射关系:", dict(zip(le.classes_, le.transform(le.classes_))))

    # 4. 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42,
                                                        stratify=y_encoded)

    # 5. 训练 XGBoost 模型
    print("开始训练 XGBoost 模型...")
    model = xgb.XGBClassifier(
        objective='multi:softmax',
        num_class=len(le.classes_),
        max_depth=6,
        learning_rate=0.1,
        n_estimators=100,
        eval_metric='mlogloss',
        use_label_encoder=False  # 显式关闭该参数以消除警告
    )

    model.fit(X_train, y_train)

    # 6. 预测与评估
    y_pred_encoded = model.predict(X_test)
    y_pred = le.inverse_transform(y_pred_encoded)
    y_test_original = le.inverse_transform(y_test)

    print("\n================ 评估结果 ================")
    print(f"准确率 (Accuracy): {accuracy_score(y_test_original, y_pred):.4f}")
    print("\n分类报告 (Classification Report):")
    print(classification_report(y_test_original, y_pred))

    # 7. 绘制混淆矩阵
    cm = confusion_matrix(y_test_original, y_pred, labels=le.classes_)
    plt.figure(figsize=(12, 10))
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
                xticklabels=le.classes_, yticklabels=le.classes_)
    plt.title('Confusion Matrix')
    plt.xlabel('Predicted Label')
    plt.ylabel('True Label')
    plt.show()

准确率 (Accuracy): 0.6414

python 复制代码
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score, confusion_matrix
import xgboost as xgb
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt

# 解决中文显示问题(Windows系统使用SimHei黑体)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号

# ================= 1. 数据读取与合并 =================
def load_and_merge_data(file_path):
    """读取Excel的所有Sheet并合并,同时自动打上路面标签"""
    xls = pd.ExcelFile(file_path)
    all_data = []

    print("正在读取数据...")
    for sheet in xls.sheet_names:
        # 读取当前Sheet
        df = pd.read_excel(xls, sheet_name=sheet)

        # 假设你的列名是 x, y, z,这里统一转为小写防止大小写问题
        df.columns = [col.lower() for col in df.columns]

        # 给数据打上标签(直接用Sheet的名字作为路面类型,比如 '湿滑-11')
        df['label'] = sheet

        all_data.append(df)

    # 将所有Sheet的数据纵向拼接
    merged_df = pd.concat(all_data, ignore_index=True)
    print(f"数据合并完成,总样本数: {len(merged_df)}")
    return merged_df


# ================= 2. 特征提取 (滑动窗口) =================
# ================= 2. 特征提取 (滑动窗口) =================
def extract_features(df, window_size=1600, step_size=800): # 增加步长参数
    features = []
    labels = []

    # 把原来的 window_size 步长,改成 step_size 步长
    for i in range(0, len(df) - window_size, step_size):
        window = df.iloc[i: i + window_size]

        row_features = []
        for axis in ['x', 'y', 'z']:
            row_features.extend([
                window[axis].mean(),
                window[axis].std(),
                window[axis].max(),
                window[axis].min()
            ])

        features.append(row_features)
        labels.append(window['label'].iloc[0])

    feature_df = pd.DataFrame(features, columns=[
        'x_mean', 'x_std', 'x_max', 'x_min',
        'y_mean', 'y_std', 'y_max', 'y_min',
        'z_mean', 'z_std', 'z_max', 'z_min'
    ])
    feature_df['label'] = labels
    return feature_df


# ================= 3. 主程序 =================
if __name__ == "__main__":
    # 替换为你标准化后的数据路径
    file_path = '江淮试验场路面识别数据集_标准化后.xlsx'

    # 1. 加载数据
    raw_data = load_and_merge_data(file_path)

    # 2. 提取特征 (这里设定每500条数据作为一个样本片段)
    feature_data = extract_features(raw_data, window_size=3200, step_size=1600)

    # 3. 划分特征 (X) 和 标签 (y)
    X = feature_data.drop('label', axis=1)
    y = feature_data['label']

    # 【新增】把中文标签转换成数字(0, 1, 2...)
    from sklearn.preprocessing import LabelEncoder

    le = LabelEncoder()
    y_encoded = le.fit_transform(y)  # 转换后的数字标签

    # 打印一下转换对照表,方便你查看哪个数字代表哪条路
    print("标签映射关系:", dict(zip(le.classes_, le.transform(le.classes_))))

    # 4. 划分训练集和测试集 (80%训练,20%测试)
    # 注意:这里传入的是 y_encoded(数字标签)
    X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42,
                                                        stratify=y_encoded)

    # 5. 训练 XGBoost 模型
    print("开始训练 XGBoost 模型...")
    model = xgb.XGBClassifier(
        objective='multi:softmax',
        num_class=len(le.classes_),  # 类别数量
        max_depth=6,
        learning_rate=0.1,
        n_estimators=100,
        eval_metric='mlogloss'
    )

    model.fit(X_train, y_train)

    # 6. 预测与评估
    y_pred_encoded = model.predict(X_test)  # 预测出来的也是数字

    # 【新增】把预测的数字标签还原成中文标签,方便阅读
    y_pred = le.inverse_transform(y_pred_encoded)
    y_test_original = le.inverse_transform(y_test)

    print("\n================ 评估结果 ================")
    print(f"准确率 (Accuracy): {accuracy_score(y_test_original, y_pred):.4f}")
    print("\n分类报告 (Classification Report):")
    # print(classification_report(y_test_original, y_pred))
    # 加上 zero_division=0,遇到除数为0的情况直接记为0,不再弹出警告
    print(classification_report(y_test_original, y_pred, zero_division=0))
    # cm = confusion_matrix(y_test_original, y_pred, labels=le.classes_)
    # 7. 绘制混淆矩阵
    cm = confusion_matrix(y_test_original, y_pred, labels=le.classes_)
    plt.figure(figsize=(12, 10))  # 稍微把图拉宽一点,防止中文名字重叠
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
                xticklabels=le.classes_, yticklabels=le.classes_)
    plt.title('Confusion Matrix')
    plt.xlabel('Predicted Label')
    plt.ylabel('True Label')
    plt.show()

准确率 (Accuracy): 0.7222

️ 3.📊 两段代码的改进点总结
对比维度 64% 准确率版本 (基础版) 72% 准确率版本 (进阶版) 改进效果分析
1. 滑动步长 step = window_size (无重叠) step = window_size / 2 (50% 重叠) 样本量翻倍:重叠采样让模型看到了更多路面片段,缓解了测试集样本过少的问题。
2. 窗口大小 500 (约0.3秒) 3200 (约2秒) 特征更丰富:更大的窗口能捕捉完整的路面震动周期,显著提升了 F1-score。
3. 标签纯度 ❌ 无检查 (交界处强制打标) ✅ 有检查 (nunique > 1 跳过) 降低噪声:虽然进阶版代码截图里没写这个逻辑,但如果你用了它,这能避免"沥青+湿滑"混合数据误导模型。
4. 警告处理 手动设置参数消除 使用 warnings.filterwarnings 代码整洁:不影响准确率,但让控制台输出更清爽。

💡 核心结论

72% 的版本胜在"用时间换空间"。通过增大窗口(看更长的数据)和重叠采样(切更多的样本),模型获得了更稳定的统计特征。


4.🚀 如何再精进?预测准确率突破 80% 的方案

目前的 72% 瓶颈在于:仅靠时域统计特征(均值、方差等)无法完全区分相似路面。要进一步提升,建议从以下三个维度入手:

1. 引入频域特征 (最推荐 🔥)

路面震动的本质是频率信号。沥青路和湿滑路可能在"均值"上很像,但在"频率分布"上截然不同。

  • 操作 :对每个窗口的 x/y/z 轴数据做 FFT (快速傅里叶变换)
  • 新增特征:提取频谱能量、主频、频谱熵等。
  • 预期提升:这是路面识别中最有效的提分手段,通常能带来 5%-10% 的提升。
2. 优化 XGBoost 超参数

目前你使用的是默认参数 (max_depth=6, learning_rate=0.1),这比较保守。

  • 操作 :使用 GridSearchCVOptuna 进行自动调参。
  • 重点关注max_depth (尝试 8-12), min_child_weight, subsample, colsample_bytree
  • 预期提升:精细化调参通常能榨出 2%-5% 的性能。
3. 解决类别不平衡

你的数据中 湿滑-11 只有 5 个样本,而 湿滑-41 有 33 个。模型会倾向于忽略小样本类别。

  • 操作 :在 XGBClassifier 中加入 scale_pos_weight 参数,或者使用 SMOTE 算法进行过采样。
  • 预期提升:显著提升小样本路面的召回率 (Recall)。

七、加入频域特征和网格参数进行优化:

  1. 加入 FFT 频域特征(在原有的均值、方差后面,增加频谱能量和主频率)。

  2. 加入 GridSearchCV 自动调参(替换掉原来写死的参数,让程序自动寻找最优解)

    python 复制代码
    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split, GridSearchCV
    from sklearn.metrics import classification_report, accuracy_score, confusion_matrix
    import xgboost as xgb
    import seaborn as sns
    import matplotlib.pyplot as plt
    from scipy.fft import fft  # 【新增】引入FFT用于提取频域特征
    from sklearn.preprocessing import LabelEncoder
    import warnings
    
    # 解决中文显示问题(Windows系统使用SimHei黑体)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    # 【新增】忽略一些无关紧要的警告,让控制台更干净
    warnings.filterwarnings("ignore", category=UserWarning)
    
    
    # ================= 1. 数据读取与合并 =================
    def load_and_merge_data(file_path):
        """读取Excel的所有Sheet并合并,同时自动打上路面标签"""
        xls = pd.ExcelFile(file_path)
        all_data = []
    
        print("正在读取数据...")
        for sheet in xls.sheet_names:
            df = pd.read_excel(xls, sheet_name=sheet)
            df.columns = [col.lower() for col in df.columns]
            df['label'] = sheet
            all_data.append(df)
    
        merged_df = pd.concat(all_data, ignore_index=True)
        print(f"数据合并完成,总样本数: {len(merged_df)}")
        return merged_df
    
    
    # ================= 2. 特征提取 (滑动窗口 + FFT频域) =================
    def extract_features(df, window_size=3200, step_size=1600):
        features = []
        labels = []
    
        # 按照步长切分数据
        for i in range(0, len(df) - window_size, step_size):
            window = df.iloc[i: i + window_size]
    
            # 【新增】过滤交界处噪声(如果窗口内包含多种路面,直接跳过)
            if window['label'].nunique() > 1:
                continue
    
            row_features = []
            for axis in ['x', 'y', 'z']:
                data = window[axis].values
    
                # --- 原有的时域特征 ---
                row_features.extend([
                    np.mean(data),
                    np.std(data),
                    np.max(data),
                    np.min(data)
                ])
    
                # --- 【新增】频域特征 (FFT) ---
                # 1. 计算快速傅里叶变换
                fft_vals = fft(data)
                # 2. 计算频谱能量 (振幅的平方和)
                spectral_energy = np.sum(np.abs(fft_vals) ** 2)
                # 3. 提取主频率 (能量最大的频率点,假设采样率为1600Hz)
                freqs = np.fft.fftfreq(len(data), d=1 / 1600)
                pos_mask = freqs > 0  # 只看正频率
                dominant_freq = np.abs(freqs[pos_mask])[np.argmax(np.abs(fft_vals[pos_mask]))]
    
                row_features.extend([spectral_energy, dominant_freq])
    
            features.append(row_features)
            labels.append(window['label'].iloc[0])
    
        # 【更新】增加频域特征的列名
        feature_df = pd.DataFrame(features, columns=[
            'x_mean', 'x_std', 'x_max', 'x_min', 'x_fft_energy', 'x_fft_freq',
            'y_mean', 'y_std', 'y_max', 'y_min', 'y_fft_energy', 'y_fft_freq',
            'z_mean', 'z_std', 'z_max', 'z_min', 'z_fft_energy', 'z_fft_freq'
        ])
        feature_df['label'] = labels
        return feature_df
    
    
    # ================= 3. 主程序 =================
    if __name__ == "__main__":
        # 替换为你标准化后的数据路径
        file_path = '江淮试验场路面识别数据集_标准化后.xlsx'
    
        # 1. 加载数据
        raw_data = load_and_merge_data(file_path)
    
        # 2. 提取特征 (2秒窗口,1秒步长重叠)
        feature_data = extract_features(raw_data, window_size=3200, step_size=1600)
        print(f"特征提取完成,生成样本数: {len(feature_data)}")
    
        # 3. 划分特征 (X) 和 标签 (y)
        X = feature_data.drop('label', axis=1)
        y = feature_data['label']
    
        # 把中文标签转换成数字(0, 1, 2...)
        le = LabelEncoder()
        y_encoded = le.fit_transform(y)
    
        print("标签映射关系:", dict(zip(le.classes_, le.transform(le.classes_))))
    
        # 4. 划分训练集和测试集 (80%训练,20%测试)
        X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42,
                                                            stratify=y_encoded)
    
        # 5. 【升级】XGBoost 自动调参训练
        print("开始 XGBoost 自动调参训练 (这可能需要几分钟,请耐心等待)...")
    
        base_model = xgb.XGBClassifier(
            objective='multi:softmax',
            num_class=len(le.classes_),
            eval_metric='mlogloss',
            use_label_encoder=False,
            random_state=42
        )
    
        # 定义要搜索的参数网格(让程序自己找最优组合)
        param_grid = {
            'max_depth': [6, 8, 10],
            'learning_rate': [0.05, 0.1],
            'n_estimators': [100, 150]
        }
    
        # 执行网格搜索(cv=3表示3折交叉验证,n_jobs=-1表示使用所有CPU核心加速)
        grid_search = GridSearchCV(
            estimator=base_model,
            param_grid=param_grid,
            scoring='accuracy',
            cv=3,
            verbose=1,
            n_jobs=-1
        )
    
        grid_search.fit(X_train, y_train)
    
        # 获取最佳模型
        best_model = grid_search.best_estimator_
        print(f"找到最佳参数组合: {grid_search.best_params_}")
    
        # 6. 预测与评估
        y_pred_encoded = best_model.predict(X_test)
    
        # 把预测的数字标签还原成中文标签
        y_pred = le.inverse_transform(y_pred_encoded)
        y_test_original = le.inverse_transform(y_test)
    
        print("\n================ 评估结果 ================")
        print(f"准确率 (Accuracy): {accuracy_score(y_test_original, y_pred):.4f}")
        print("\n分类报告 (Classification Report):")
        print(classification_report(y_test_original, y_pred, zero_division=0))
    
        # 7. 绘制混淆矩阵
        cm = confusion_matrix(y_test_original, y_pred, labels=le.classes_)
        plt.figure(figsize=(12, 10))
        sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
                    xticklabels=le.classes_, yticklabels=le.classes_)
        plt.title('Confusion Matrix')
        plt.xlabel('Predicted Label')
        plt.ylabel('True Label')
        plt.show()

    结果:

    python 复制代码
    ================ 评估结果 ================
    准确率 (Accuracy): 0.7921
    
    分类报告 (Classification Report):
                  precision    recall  f1-score   support
    
           沥青-11       0.71      0.83      0.77         6
           沥青-12       0.60      0.60      0.60         5
           沥青-13       0.50      0.67      0.57         6
           沥青-14       0.67      0.50      0.57         4
           沥青-21       1.00      0.86      0.92         7
           沥青-22       1.00      0.86      0.92         7
           沥青-23       0.88      1.00      0.93         7
           沥青-24       0.75      0.86      0.80         7
           沥青-31       0.88      1.00      0.93         7
           沥青-32       0.67      0.57      0.62         7
           沥青-33       0.80      0.89      0.84         9
           沥青-34       0.75      0.75      0.75         8
           湿滑-11       1.00      1.00      1.00         1
           湿滑-12       0.50      0.50      0.50         2
           湿滑-21       1.00      1.00      1.00         1
           湿滑-22       1.00      0.50      0.67         2
           湿滑-31       0.00      0.00      0.00         1
           湿滑-32       1.00      0.50      0.67         2
           湿滑-41       1.00      1.00      1.00        10
           湿滑-42       0.50      0.50      0.50         2
    
        accuracy                           0.79       101
       macro avg       0.76      0.72      0.73       101
    weighted avg       0.80      0.79      0.79       101
    
    
    进程已结束,退出代码为 0

    改为五折交叉验证:cv=5

运行结果:

python 复制代码
找到最佳参数组合: {'learning_rate': 0.1, 'max_depth': 6, 'n_estimators': 150}

================ 评估结果 ================
准确率 (Accuracy): 0.8119

分类报告 (Classification Report):
              precision    recall  f1-score   support

       沥青-11       0.71      0.83      0.77         6
       沥青-12       0.60      0.60      0.60         5
       沥青-13       0.50      0.67      0.57         6
       沥青-14       0.67      0.50      0.57         4
       沥青-21       1.00      0.86      0.92         7
       沥青-22       1.00      0.86      0.92         7
       沥青-23       1.00      1.00      1.00         7
       沥青-24       0.78      1.00      0.88         7
       沥青-31       0.88      1.00      0.93         7
       沥青-32       0.67      0.57      0.62         7
       沥青-33       0.80      0.89      0.84         9
       沥青-34       0.75      0.75      0.75         8
       湿滑-11       1.00      1.00      1.00         1
       湿滑-12       0.50      0.50      0.50         2
       湿滑-21       1.00      1.00      1.00         1
       湿滑-22       1.00      0.50      0.67         2
       湿滑-31       1.00      1.00      1.00         1
       湿滑-32       1.00      0.50      0.67         2
       湿滑-41       1.00      1.00      1.00        10
       湿滑-42       1.00      0.50      0.67         2

    accuracy                           0.81       101
   macro avg       0.84      0.78      0.79       101
weighted avg       0.83      0.81      0.81       101


进程已结束,退出代码为 0
相关推荐
Reart1 小时前
Leetcode 121. 买卖股票的最佳时机(717)
后端·算法
会编程的小孩1 小时前
初识数据类型以及变量定义
数据结构·算法
Reart1 小时前
Leetcode 337.打家劫舍3(717)
后端·算法
梅梅绵绵冰1 小时前
数据结构-时间复杂度
数据结构·算法
遥感知识服务1 小时前
盐碱地、白屋顶和裸土都很亮,卫星怎样分清?
人工智能·算法·机器学习
可编程芯片开发2 小时前
基于PID控制器的车辆控制系统simulink建模与仿真
算法
广州灵眸科技有限公司2 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) 系统操作-线进程操作
数据库·单片机·嵌入式硬件·算法·php
-dzk-2 小时前
【哈希】LC 49.字母异位词分组
算法·哈希算法
·醉挽清风·2 小时前
学习笔记—算法—算法题
笔记·学习·算法