机器学习中,使用随机森林建模,并调优,没有报错,但是为什么精确率和f1值计算为空值



关注引自免费微信小程序:皆我百晓生
在您提供的代码中,看起来您正在使用随机森林进行分类任务,并且尝试对模型进行调优。从您给出的结果来看,测试集的精度(Precision)和召回率(Recall)显示为 NaN,这通常意味着在某些类别中没有预测正确的样本,导致分母为零。
解决这个问题的方法包括:
根据您提供的信息,让我们首先检查数据分布,然后尝试调整模型参数并重新评估。
为了演示如何执行这些步骤,这里是一个完整的代码示例:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.datasets import fetch_20newsgroups
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
# 加载一个示例数据集
twenty_train = fetch_20newsgroups(subset='train', remove=('headers', 'footers', 'quotes'))
twenty_test = fetch_20newsgroups(subset='test', remove=('headers', 'footers', 'quotes'))
# 文本特征提取
vectorizer = TfidfVectorizer()
x_train = vectorizer.fit_transform(twenty_train.data)
x_test = vectorizer.transform(twenty_test.data)
y_train = twenty_train.target
y_test = twenty_test.target
# 划分训练集和验证集
x_train_tfidf, x_val_tfidf, y_train, y_val = train_test_split(x_train, y_train, test_size=0.2, random_state=1)
# 定义参数网格
param_grid = {
'n_estimators': list(range(10, 400, 5)),
'max_depth': list(range(1, 400, 5)),
'max_leaf_nodes': list(range(1, 400, 5)),
'min_samples_split': list(range(2, 200, 5)),
'min_samples_leaf': list(range(1, 100, 5))
}
# 使用GridSearchCV进行参数优化
grid_search = GridSearchCV(RandomForestClassifier(random_state=1), param_grid, cv=5, scoring='accuracy')
grid_search.fit(x_train_tfidf, y_train)
# 获取最佳参数
best_params = grid_search.best_params_
print("最优参数:", best_params)
# 使用最佳参数构建新的随机森林模型
best_rfc = RandomForestClassifier(**best_params, random_state=1)
best_rfc.fit(x_train_tfidf, y_train)
# 训练集评估
y_pred_train = best_rfc.predict(x_train_tfidf)
print("训练集结果:")
print("Accuracy:", accuracy_score(y_train, y_pred_train))
print("Precision:", precision_score(y_train, y_pred_train, average='weighted'))
print("Recall:", recall_score(y_train, y_pred_train, average='weighted'))
print("F1 Score:", f1_score(y_train, y_pred_train, average='weighted'))
print("AUC-ROC:", roc_auc_score(y_train, y_pred_train))
# 验证集评估
y_pred_val = best_rfc.predict(x_val_tfidf)
print("\n验证集结果:")
print("Accuracy:", accuracy_score(y_val, y_pred_val))
print("Precision:", precision_score(y_val, y_pred_val, average='weighted'))
print("Recall:", recall_score(y_val, y_pred_val, average='weighted'))
print("F1 Score:", f1_score(y_val, y_pred_val, average='weighted'))
print("AUC-ROC:", roc_auc_score(y_val, y_pred_val))
这个例子使用了20Newsgroups数据集,这是一个预处理过的文本分类数据集。您可以将这部分替换为您实际的数据集。通过使用GridSearchCV进行参数搜索,我们能获得一组更好的超参数,然后基于这些参数构建的模型应该能够提供更有意义的评估指标。注意在计算精度和召回率时,我们使用了average='weighted',这意味着结果会根据各个类别的权重进行加权求和,有助于处理类别不平衡的问题。
如果您仍然遇到精度和召回率为NaN的情况,请检查您的数据是否存在类别分布严重不均衡的问题,或者模型是否过拟合。在这种情况下,您可能需要进一步探索正则化、欠采样、过采样或SMOTE技术来改善模型性能。