import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report
from sklearn.preprocessing import KBinsDiscretizer
import matplotlib.pyplot as plt
from sklearn.metrics import ConfusionMatrixDisplay, confusion_matrix
import matplotlib as mpl
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 提供文件的绝对路径
file_path = r'D:\BP_R_Data.xlsx' # 请替换为实际路径
# 尝试读取Excel文件
try:
df = pd.read_excel(file_path, sheet_name='Sheet1', engine='openpyxl')
# 假设最后一列为目标变量(混凝土抗压强度),其余为特征
target_column = df.columns[-1]
feature_columns = df.columns[:-1]
# 将目标变量进行离散化处理,分为多个等级
discretizer = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='uniform')
y_discretized = discretizer.fit_transform(df[[target_column]]).astype(int).ravel()
# 分离特征和目标变量
X = df[feature_columns]
y = y_discretized
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练分类模型(这里使用随机森林分类器作为示例)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted')
recall = recall_score(y_test, y_pred, average='weighted')
f1 = f1_score(y_test, y_pred, average='weighted')
# 打印评估指标,使用中文标签
print(f"准确率 (Accuracy): {accuracy:.4f}")
print(f"查准率 (Precision): {precision:.4f}")
print(f"查全率 (Recall): {recall:.4f}")
print(f"F1值 (F1 Score): {f1:.4f}")
# 使用classification_report获得更详细的报告,并设置中文标签
print("\n分类报告:")
report = classification_report(y_test, y_pred, target_names=[f"等级{i}" for i in range(discretizer.n_bins)])
print(report)
# 生成混淆矩阵
cm = confusion_matrix(y_test, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=[f"等级{i}" for i in range(discretizer.n_bins)])
fig, ax = plt.subplots(figsize=(8, 6))
disp.plot(ax=ax, cmap='Blues')
plt.title('混凝土抗压强度等级的混淆矩阵')
plt.xlabel('预测等级')
plt.ylabel('真实等级')
plt.show()
except FileNotFoundError:
print(f"错误:无法找到文件,请检查路径是否正确:{file_path}")
except Exception as e:
print(f"发生错误:{e}")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通