gpt4 book ai didi

python - sklearn 的 MLPClassifier 的 Predict_proba() 函数输出总可能性不等于 1

转载 作者:行者123 更新时间:2023-11-30 09:27:51 26 4
gpt4 key购买 nike

我使用 sklearn 的 MLPClassifier 构建了一个神经网络来预测赛马的结果。然而,有时,当我使用predict_proba()函数预测每匹马获胜的可能性时,我发现总可能性不等于1。有时,它可能是0.8xx或1.2xxx或1.1xxx等。最坏的情况可能是 2.5xx 或 0.3xxx 等。

无论我如何调整模型,在某些预测中仍然会发生这种情况。另外,我在将数据输入模型之前做了 MinMaxScaler。

rdx = rdx.fillna(value=-999) #-999 means missing data
x = np.array(rdx) #rdx is the feature of data
y = np.array(rdy) #rdy is the label of data

# Scale Feature
scaler = MinMaxScaler()
scaler.fit(x)
x = scaler.transform(x)

# Build network
mlp = MLPClassifier( activation='relu',alpha=1e-4,hidden_layer_sizes=(20,20), random_state=1,max_iter=1000,verbose=10,learning_rate_init=.1)
mlp.fit(x, y)

功能(rdx):

feature

标签(rdy):

label

结果: Result每个红色方框中,是每场比赛中所有马匹的可能性。但求和后不等于一。有时,它会更糟,例如 3.5 或 0.5 等。

2条数据记录: enter image description here

我可以采取什么措施来防止这种情况发生?

最佳答案

我认为问题在于你构建标签的方式。您正在检查每匹马,这匹马获胜的概率是多少。这些总和不需要为 1。

看一下下面的例子: https://scikit-learn.org/stable/auto_examples/neural_networks/plot_mnist_filters.html#sphx-glr-auto-examples-neural-networks-plot-mnist-filters-py

y_train和y_test的形状分别为(60000,)和(40000,)。

但是,如果你将 y_train 和 y_test 更改为一个热编码向量(就像你在数据中一样),然后在转换后的标签上训练一个新的 MLP 模型,那么你会发现你将得到的概率不会相加到 1。

我修改了上面链接中引用的示例以显示我想说的内容:

import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import OneHotEncoder

# Load data from https://www.openml.org/d/554
X, y = fetch_openml('mnist_784', version=1, return_X_y=True)
X = X / 255.

# rescale the data, use the traditional train/test split
X_train, X_test = X[:60000], X[60000:]
y_train, y_test = y[:60000], y[60000:]

# mlp = MLPClassifier(hidden_layer_sizes=(100, 100), max_iter=400, alpha=1e-4,
# solver='sgd', verbose=10, tol=1e-4, random_state=1)
mlp = MLPClassifier(hidden_layer_sizes=(50,), max_iter=10, alpha=1e-4,
solver='sgd', verbose=None, tol=1e-4, random_state=1,
learning_rate_init=.1)

mlp.fit(X_train, y_train)

print(y_train.shape)
print(mlp.predict_proba(X_test[:10]).sum(axis=1))

enc = OneHotEncoder(handle_unknown='ignore')

enc.fit(y_train.reshape(-1, 1))

y_train_transformed = enc.transform(y_train.reshape(-1, 1)).toarray()
y_test_transformed = enc.transform(y_test.reshape(-1, 1)).toarray()

# mlp = MLPClassifier(hidden_layer_sizes=(100, 100), max_iter=400, alpha=1e-4,
# solver='sgd', verbose=10, tol=1e-4, random_state=1)
mlp_new = MLPClassifier(hidden_layer_sizes=(50,), max_iter=10, alpha=1e-4,
solver='sgd', verbose=None, tol=1e-4, random_state=1,
learning_rate_init=.1)

mlp_new.fit(X_train, y_train_transformed)

print(y_train_transformed.shape)
print(mlp_new.predict_proba(X_test[:10]).sum(axis=1))

关于python - sklearn 的 MLPClassifier 的 Predict_proba() 函数输出总可能性不等于 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59015351/

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