Scikit Learn 预测单个观察
Scikit Learn Predicting a Single Observation
这可能是一个非常愚蠢的问题,但为什么以下给出不同的结果?
X == array([ 7.84682988e-01, 3.80109225e-17, 8.06386582e-01,
1.00000000e+00, 5.71428571e-01, 4.44189342e+00])
model.predict_proba(X)[1] # gives array([ 0.35483244, 0.64516756])
model.predict_proba(X[1]) # gives an error
model.predict_proba(list(X[1])) # gives array([[ 0.65059327, 0.34940673]])
Model
是来自 lightgbm 库的 LGBMClassifier
。
让我们分解成简单的步骤来分析:
1) model.predict_proba(X)[1]
这相当于
probas = model.predict_proba(X)
probas[1]
所以这首先输出所有样本的所有 classes 的概率。所以假设你的 X 包含 5 行和 4 个特征,有两个不同的 classes.
所以 probas 会是这样的:
Prob of class 0, prob of class 1
For sample1 [[0.1, 0.9],
For sample2 [0.8, 0.2],
For sample3 [0.85, 0.15],
For sample4 [0.4, 0.6],
For sample5 [0.01, 0.99]]
probas[1]
只会输出 probas
输出第二列的概率,即。 class 1 的概率。
Output [0.9, 0.2, 0.15, 0.6, 0.99]
其他两行代码取决于如何处理单维数组的实现和版本。例如。 scikit v18 只显示警告并将其视为单行。但是 v19(主分支)抛出错误。
编辑:为 LGBMClassifier
更新
2) model.predict_proba(X[1])
这相当于:
X_new = X[1]
model.predict_proba(X_new)
这里您只选择了第二行,结果是形状 [n_features, ]
。但是 LGBMClassifier 要求二维数据的形状为 [n_samples, n_features]
。如上所述,这可能是错误的来源。您可以重塑给定的数组以用 1 代替 n_samples:
model.predict_proba(X[1].reshape(1, -1))
# 将正常工作
3) model.predict_proba(list(X[1]))
这可以分解为:
X_new = list(X[1])
model.predict_proba(X_new)
这也与第二种情况基本相同,只是 X_new
现在是一个列表而不是 numpy 数组,并且自动处理为单行(与第二种情况下的 X[1].reshape(1, -1)
相同),而不是抛出错误。
所以考虑上面的例子,输出将只有,
For sample2 [0.8, 0.2],
这可能是一个非常愚蠢的问题,但为什么以下给出不同的结果?
X == array([ 7.84682988e-01, 3.80109225e-17, 8.06386582e-01,
1.00000000e+00, 5.71428571e-01, 4.44189342e+00])
model.predict_proba(X)[1] # gives array([ 0.35483244, 0.64516756])
model.predict_proba(X[1]) # gives an error
model.predict_proba(list(X[1])) # gives array([[ 0.65059327, 0.34940673]])
Model
是来自 lightgbm 库的 LGBMClassifier
。
让我们分解成简单的步骤来分析:
1) model.predict_proba(X)[1]
这相当于
probas = model.predict_proba(X)
probas[1]
所以这首先输出所有样本的所有 classes 的概率。所以假设你的 X 包含 5 行和 4 个特征,有两个不同的 classes.
所以 probas 会是这样的:
Prob of class 0, prob of class 1
For sample1 [[0.1, 0.9],
For sample2 [0.8, 0.2],
For sample3 [0.85, 0.15],
For sample4 [0.4, 0.6],
For sample5 [0.01, 0.99]]
probas[1]
只会输出 probas
输出第二列的概率,即。 class 1 的概率。
Output [0.9, 0.2, 0.15, 0.6, 0.99]
其他两行代码取决于如何处理单维数组的实现和版本。例如。 scikit v18 只显示警告并将其视为单行。但是 v19(主分支)抛出错误。
编辑:为 LGBMClassifier
更新2) model.predict_proba(X[1])
这相当于:
X_new = X[1]
model.predict_proba(X_new)
这里您只选择了第二行,结果是形状 [n_features, ]
。但是 LGBMClassifier 要求二维数据的形状为 [n_samples, n_features]
。如上所述,这可能是错误的来源。您可以重塑给定的数组以用 1 代替 n_samples:
model.predict_proba(X[1].reshape(1, -1))
# 将正常工作
3) model.predict_proba(list(X[1]))
这可以分解为:
X_new = list(X[1])
model.predict_proba(X_new)
这也与第二种情况基本相同,只是 X_new
现在是一个列表而不是 numpy 数组,并且自动处理为单行(与第二种情况下的 X[1].reshape(1, -1)
相同),而不是抛出错误。
所以考虑上面的例子,输出将只有,
For sample2 [0.8, 0.2],