gpt4 book ai didi

python - Sklearn DecisionTreeClassifier 每次运行的 F 分数不同结果

转载 作者:行者123 更新时间:2023-11-30 09:32:16 25 4
gpt4 key购买 nike

我正在尝试使用 Python 训练决策树分类器。我使用 MinMaxScaler() 来缩放数据,并使用 f1_score 作为我的评估指标。奇怪的是,我注意到我的模型在每次运行时都会以某种模式给出不同的结果。

我的代码中的

data(2000, 7) pandas.DataFrame,有 6 个特征列,最后一列是目标值(value)。第 1、3 和 5 列是分类数据。

以下代码是我对数据进行预处理和格式化的代码:

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import f1_score


# Data Preprocessing Step
# =============================================================================
data = pd.read_csv("./data/train.csv")

X = data.iloc[:, :-1]
y = data.iloc[:, 6]

# Choose which columns are categorical data, and convert them to numeric data.
labelenc = LabelEncoder()
categorical_data = list(data.select_dtypes(include='object').columns)

for i in range(len(categorical_data)):
X[categorical_data[i]] = labelenc.fit_transform(X[categorical_data[i]])


# Convert categorical numeric data to one-of-K data, and change y from Series to ndarray.
onehotenc = OneHotEncoder()
X = onehotenc.fit_transform(X).toarray()
y = y.values

X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2)

min_max_scaler = MinMaxScaler()
X_train_scaled = min_max_scaler.fit_transform(X_train)
X_val_scaled = min_max_scaler.fit_transform(X_val)


下一个代码用于实际的决策树模型训练:

dectree = DecisionTreeClassifier(class_weight='balanced')
dectree = dectree.fit(X_train_scaled, y_train)
predictions = dectree.predict(X_val_scaled)
score = f1_score(y_val, predictions, average='macro')

print("Score is = {}".format(score))


我得到的输出(即分数)各不相同,但有一定的模式。例如,它会在 0.390.42 范围内的数据之间循环。

在某些迭代中,我什至收到 UndefinedMetricWarning,声称“F 分数定义不明确,在没有预测样本的标签中设置为 0.0。”

在这个社区和 Google 上进行一些搜索后,我熟悉了 UndefinedMetricWarning 的含义。我想我的两个问题可以整理为:


  1. 为什么每次迭代我的输出都不同?预处理阶段是否发生了我不知道的事情?

  2. 我还尝试将 F 分数与其他数据拆分一起使用,但我总是收到警告。这是无法避免的吗?

谢谢。

最佳答案

您将数据集分为训练集和测试集,随机划分训练集和测试集。因此,当您每次使用不同的训练数据训练模型,并使用不同的测试数据对其进行测试时,您将获得一系列 F 分数,具体取决于模型的训练程度。

为了在每次运行时复制结果,请使用random_state参数。它将保持一个随机数状态,每次运行时都会给你相同的随机数。这表明随机数是按相同顺序生成的。这可以是任何数字。

#train test split
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=13)

#Decision tree model
dectree = DecisionTreeClassifier(class_weight='balanced', random_state=2018)

关于python - Sklearn DecisionTreeClassifier 每次运行的 F 分数不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53434609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com