使用 Scikit Learn 获取预测元素的百分比

Posted

技术标签:

【中文标题】使用 Scikit Learn 获取预测元素的百分比【英文标题】:Get percentages of predicted elements using Scikit Learn 【发布时间】:2018-12-08 11:17:34 【问题描述】:

我使用以下代码创建了一个 scikit RandomForest 模型并对其进行训练然后保存:

import pandas as pd 
import sklearn
from pandas import Series, DataFrame
from sklearn.model_selection import train_test_split
import sklearn.metrics
from sklearn.ensemble import RandomForestClassifier
import pickle

data = pd.read_csv("data_30000_30.csv")
data.head() #Just to give you an idea about how my CSV file looks like
feature_cols = ["width1", "width2", "width3", "width4", "width5", "width6", "width7", "width8", "width9", "width10"]

x = data[feature_cols]
y = data.label
x_train, x_test, y_train, y_test = train_test_split(x, y , test_size = 0.3)



classifier = RandomForestClassifier(n_estimators = 100)
classifier.fit(x_train, y_train)
predictions = classifier.predict(x_test)
conf_matrix = sklearn.metrics.confusion_matrix(y_test, predictions)
print(conf_matrix)
print(sklearn.metrics.accuracy_score(y_test, predictions))

with open('myclassifier.pkl', 'wb') as fid:
    pickle.dump(classifier, fid)
fid.close()

一切顺利,我得到以下输出:

CSV 文件的头部:

分类器的参数:

RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False)

conf_matrix 的输出:

array([[6272, 2513,   26,  153,   54],
       [3073, 5634,   37,  322,   27],
       [   1,    5, 5057,  775, 3072],
       [  22,   65,  429, 8245,  208],
       [  58,   50, 1458,  509, 6935]])

准确度:

0.7142888888888889

然后我使用以下代码加载我保存的预训练模型并使用新数据对其进行测试:

import pandas as pd 
import sklearn
from pandas import Series, DataFrame
from sklearn.model_selection import train_test_split
import sklearn.metrics
import pickle


with open('saved_model/myclassifier.pkl', 'rb') as fid:
    classifier = pickle.load(fid)
fid.close()
data = pd.read_csv("testing_loaded_model/Ttest_model_30.csv")
Ypredict = classifier.predict(data) 
print(Ypredict)

这段代码的输出是一个包含预测元素名称的数组(即['Cube' 'Cylinder' 'Pyramid' 'Cube'...]

但是,我想获取数组元素加上它们的百分比,scikit 库中有没有函数可以获取百分比,或者我将计算它?谢谢请耐心阅读完整的说明。

【问题讨论】:

【参考方案1】:

希望我能正确理解您的问题:

有一种方法可以得到概率。

scikit-learn 中的随机森林以及许多其他分类器提供了predict_proba 函数。 使用该函数,您可以获得一个数组,其中包含代表特定列的特定类的概率。

所以在你的例子中你可以写:

predictions = classifier.predict_proba(data)

【讨论】:

谢谢,这很有帮助。是否有另一个函数可以汇总每个类的所有概率? eg: 做完测试后显示:Cube: 85% Cylinder 12% Pyramid 3% 或者我应该做一些代码来计算最终的概率吗?再次感谢您。 不确定如何理解这个问题:对每个类的所有概率求和将不再返回概率。所以这里的求和是否正确是值得怀疑的。但是,如果您想用上面的输出呈现单个预测,那么您需要做一些工作。格式字符串应该是要走的路,我建议

以上是关于使用 Scikit Learn 获取预测元素的百分比的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 的 k-means:预测方法的真正作用是啥?

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

Scikit-Learn SVR 预测总是给出相同的值

使用 Scikit-Learn 在管道中包含预测器

您如何使用 Scikit learn 预测分类变量和连续变量的组合?

使用 SVM 模型和 scikit-learn 进行预测的 AttributeError