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

sin*_*ium 0 python pickle random-forest scikit-learn

我使用以下代码创建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()
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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]])
Run Code Online (Sandbox Code Playgroud)

准确度:

0.7142888888888889
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

但是,我想获取数组元素加上它们的百分比,scikit 库中是否有函数可以获取百分比,或者我应该计算它?
预先感谢您耐心阅读整个说明。

Qui*_*2k1 5

我希望我正确理解你的问题:

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

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

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

predictions = classifier.predict_proba(data)
Run Code Online (Sandbox Code Playgroud)