import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score, precision_score, recall_score, f1_score
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 加载数据集
df = pd.read_excel('F:\\高璇的仓库哈哈哈哈\\Data.xlsx')
# 打印列名以检查
print("列名:")
print(df.columns)
# 2. 数据集统计信息
print("\n统计信息:")
print(df.describe())
# 3. 数据可视化处理
print("\n前6行数据:")
print(df.head(6))
# 绘制各特征之间关系的矩阵图
sns.pairplot(df)
plt.show()
# 4. 数据预处理 - 离散化处理
strength_column = 'a' # 假设'承重强度'列为 'a',请根据实际列名调整
# 离散化方案1:使用qcut方法将承重强度分为3个等级
df['Compressive_Strength_Category_qcut'] = pd.qcut(df[strength_column], q=3, labels=['Low', 'Medium', 'High'])
# 编码标签
le = LabelEncoder()
df['Compressive_Strength_Category_qcut'] = le.fit_transform(df['Compressive_Strength_Category_qcut'])
# 选择离散化后的标签作为目标
y = df['Compressive_Strength_Category_qcut']
# 特征选择
X = df.drop([strength_column, 'Compressive_Strength_Category_qcut'], axis=1)
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 6. 机器学习模型拟合
rf = RandomForestClassifier(random_state=42)
rf.fit(X_train, y_train)
# 7. 交叉验证和超参数估计
scores = cross_val_score(rf, X_train, y_train, cv=5)
print(f'交叉验证分数:{scores.mean()}')
param_grid = {
'n_estimators': [100, 200],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5]
}
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)
print(f'最佳超参数:{grid_search.best_params_}')
# 8. 预测结果和结果展示
y_pred = rf.predict(X_test)
# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()
# 输出分类报告(包括精度、查准率、查全率、F1值)
print("分类报告:")
# 使用 LabelEncoder 的 classes_ 获取类别标签
report = classification_report(y_test, y_pred, target_names=le.classes_.astype(str)) # 确保类别为字符串类型
print(report)
# 精度、查准率、查全率、F1值的计算
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:.4f}")
print(f"查准率: {precision:.4f}")
print(f"查全率: {recall:.4f}")
print(f"F1值: {f1:.4f}")
# 9. 结果分析
# 超参数影响分析:在此部分你可以展示不同超参数的影响以及如何调整模型参数来改善性能。
# 如交叉验证和网格搜索可以帮助找到最佳的参数集。
# 可能存在的问题:
# - 数据离散化方法的选择对模型性能有较大影响,需要根据任务需求选择最合适的离散化方法。
# - 不同模型可能对不同离散化方式的表现有所差异,因此建议进行多次实验对比。
# - 数据特征之间可能存在较强的相关性,建议对特征进行相关性分析和降维。
# 可提升的改进思路:
# - 可以尝试更多的离散化方法,如基于机器学习的聚类方法等。
# - 可以使用不同的分类算法进行对比,如XGBoost、SVM等。
对比:
import pandas as pd标签:Category,Strength,Compressive,df,代码,test,混凝土,print From: https://www.cnblogs.com/aixin52129211/p/18632876
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score, precision_score, recall_score, f1_score
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 加载数据集
df = pd.read_excel('F:\\高璇的仓库哈哈哈哈\\Data.xlsx')
# 打印列名以检查
print("列名:")
print(df.columns)
# 2. 数据集统计信息
print("\n统计信息:")
print(df.describe())
# 3. 数据可视化处理
print("\n前6行数据:")
print(df.head(6))
# 绘制各特征之间关系的矩阵图
sns.pairplot(df)
plt.show()
# 4. 数据预处理 - 离散化处理
strength_column = 'a' # 假设'承重强度'列为 'a',请根据实际列名调整
# 离散化方案1:使用qcut方法将承重强度分为3个等级
df['Compressive_Strength_Category_qcut'] = pd.qcut(df[strength_column], q=3, labels=['Low', 'Medium', 'High'])
# 离散化方案2:使用等距法将承重强度分为3个等级
min_strength = df[strength_column].min()
max_strength = df[strength_column].max()
df['Compressive_Strength_Category_equal'] = pd.cut(df[strength_column], bins=[min_strength, (max_strength - min_strength) / 3, (2 * max_strength - min_strength) / 3, max_strength], labels=['Low', 'Medium', 'High'])
# 离散化方案3:基于自定义阈值
thresholds = [15, 30] # 假设自定义阈值
df['Compressive_Strength_Category_threshold'] = pd.cut(df[strength_column], bins=[-np.inf, thresholds[0], thresholds[1], np.inf], labels=['Low', 'Medium', 'High'])
# 编码标签
le = LabelEncoder()
df['Compressive_Strength_Category_qcut'] = le.fit_transform(df['Compressive_Strength_Category_qcut'])
df['Compressive_Strength_Category_equal'] = le.fit_transform(df['Compressive_Strength_Category_equal'])
df['Compressive_Strength_Category_threshold'] = le.fit_transform(df['Compressive_Strength_Category_threshold'])
# 5. 数据划分和标准化处理
# 选择一个离散化方案进行模型训练
df_selected = df[['Compressive_Strength_Category_qcut', 'Compressive_Strength_Category_equal', 'Compressive_Strength_Category_threshold']]
y = df['Compressive_Strength_Category_qcut'] # 可以选择其他方案,比如 `Compressive_Strength_Category_equal` 或 `Compressive_Strength_Category_threshold`
# 特征选择
X = df.drop([strength_column, 'Compressive_Strength_Category_qcut', 'Compressive_Strength_Category_equal', 'Compressive_Strength_Category_threshold'], axis=1)
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 6. 机器学习模型拟合
rf = RandomForestClassifier(random_state=42)
rf.fit(X_train, y_train)
# 7. 交叉验证和超参数估计
scores = cross_val_score(rf, X_train, y_train, cv=5)
print(f'交叉验证分数:{scores.mean()}')
param_grid = {
'n_estimators': [100, 200],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5]
}
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)
print(f'最佳超参数:{grid_search.best_params_}')
# 8. 预测结果和结果展示
y_pred = rf.predict(X_test)
# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()
# 输出分类报告(包括精度、查准率、查全率、F1值)
print("分类报告:")
report = classification_report(y_test, y_pred, target_names=le.classes_)
print(report)
# 精度、查准率、查全率、F1值的计算
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:.4f}")
print(f"查准率: {precision:.4f}")
print(f"查全率: {recall:.4f}")
print(f"F1值: {f1:.4f}")
# 9. 结果分析
# 超参数影响分析:在此部分你可以展示不同超参数的影响以及如何调整模型参数来改善性能。
# 如交叉验证和网格搜索可以帮助找到最佳的参数集。
# 可能存在的问题:
# - 数据离散化方法的选择对模型性能有较大影响,需要根据任务需求选择最合适的离散化方法。
# - 不同模型可能对不同离散化方式的表现有所差异,因此建议进行多次实验对比。
# - 数据特征之间可能存在较强的相关性,建议对特征进行相关性分析和降维。
# 可提升的改进思路:
# - 可以尝试更多的离散化方法,如基于机器学习的聚类方法等。
# - 可以使用不同的分类算法进行对比,如XGBoost、SVM等。