目录
[1. 首选推荐:XGBoost / 随机森林](#1. 首选推荐:XGBoost / 随机森林)
[2. 次选推荐:支持向量机(SVM)](#2. 次选推荐:支持向量机(SVM))
[3. 谨慎使用:逻辑回归 / 朴素贝叶斯](#3. 谨慎使用:逻辑回归 / 朴素贝叶斯)
[4. 进阶选择:神经网络(CNN/LSTM)](#4. 进阶选择:神经网络(CNN/LSTM))
[1. 多分类建模](#1. 多分类建模)
[2. 特征工程增强](#2. 特征工程增强)
[3. 数据预处理优化](#3. 数据预处理优化)
[4. 模型评估与调优](#4. 模型评估与调优)
[️ 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),这比较保守。
- 操作 :使用
GridSearchCV或Optuna进行自动调参。 - 重点关注 :
max_depth(尝试 8-12),min_child_weight,subsample,colsample_bytree。 - 预期提升:精细化调参通常能榨出 2%-5% 的性能。
3. 解决类别不平衡
你的数据中 湿滑-11 只有 5 个样本,而 湿滑-41 有 33 个。模型会倾向于忽略小样本类别。
- 操作 :在
XGBClassifier中加入scale_pos_weight参数,或者使用 SMOTE 算法进行过采样。 - 预期提升:显著提升小样本路面的召回率 (Recall)。
七、加入频域特征和网格参数进行优化:
-
加入 FFT 频域特征(在原有的均值、方差后面,增加频谱能量和主频率)。
-
加入 GridSearchCV 自动调参(替换掉原来写死的参数,让程序自动寻找最优解)
pythonimport 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