具有概率目标的决策树

问题描述

我目前正在研究一种模型,用于预测一个人感染了Corona病毒后死亡的可能性。 我正在使用具有分类变量的荷兰数据集:感染日期,死亡或治愈日期,性别,年龄段等。 建议使用我已经建立的决策树。 由于我是决策树的新手,所以我需要一些帮助。 我想以概率(%)而不是以二进制输出形式表示预测(目标变量)。 我该如何实现? 我也想通过自己输入数据来处理样本,看看结果如何。 例如:让一个40岁,男性等的人来计算其生存机会。 我该如何实现? 我已附上以下代码

from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier 
import pandas as pd
import random as rnd

filename = '/Users/sef/Downloads/pima-indians-diabetes.csv'
names = ['preg','plas','pres','skin','test','mass','pedi','age','class']
dataframe = read_csv(filename,names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]

X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.3,random_state=1234)

model = DecisionTreeClassifier()

model.fit(X_train,Y_train)

DecisionTreeClassifier(class_weight=None,criterion='gini',max_depth=None,max_features=None,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,presort=False,random_state=None,splitter='best')

rnd.seed(123458)
X_new = X[rnd.randrange(X.shape[0])]
X_new = X_new.reshape(1,8)
YHat = model.predict_proba(X_new)


df = pd.DataFrame(X_new,columns = names[:-1])
df["predicted"] = YHat
print(df)

解决方法

决策树还可以估计比实例属于特定类的概率。在火车特征数据中,如下使用predict_proba(),可以返回要预测的各种类别的概率。 model.predict()返回概率最高的类

model.predict_proba()

,

您可以使用DecisionTreeClassifier的方法“ predict_proba”来计算概率,而不是二进制分类值。

为了测试可以手工创建的单个数据,您必须创建一个X_test数据形状的数组(只是它只有一个条目)。然后,您可以将其与model.predict(array)或model.predict_proba(array)一起使用。

顺便说一句,您的树当前对检索概率没有用。有一篇文章很好地解释了这个问题:https://rpmcruz.github.io/machine%20learning/2018/02/09/probabilities-trees.html

因此,您可以通过定义树的max_depths来修复代码:

from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier 
import pandas as pd
import random as rnd

filename = 'pima-indians-diabetes.csv'
names = ['preg','plas','pres','skin','test','mass','pedi','age','class']
dataframe = read_csv(filename,names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]

X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.3,random_state=1234)

model = DecisionTreeClassifier(class_weight=None,criterion='gini',max_depth=1,max_features=None,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,presort=False,random_state=None,splitter='best')

model.fit(X_train,Y_train)

rnd.seed(123458)
X_new = X[rnd.randrange(X.shape[0])]
X_new = X_new.reshape(1,8)
YHat = model.predict_proba(X_new)


df = pd.DataFrame(X_new,columns = names[:-1])
df["predicted"] = list(YHat)
print(df)
,

使用称为predict_proba的函数 model.predict_proba(X_test)

问题的第二部分,这是您将要做的。 使用与您训练过的列名称完全相同的名称创建自己的自定义数据集。 从csv读取数据,并应用相同的编码器值(如果有)。

您还可以以更有效的方式保存标签编码器对象。

label = preprocessing.LabelEncoder() 
label_encoded_columns=['Date_statistics_type','Agegroup','Sex','Province','Hospital_admission','Municipal_health_service','Deceased']
for col in label_encoded_columns:
    dataframe[col] = dataframe[col].astype(str)
Label_Encoder = labelencoder.fit(dataframe[label_encoded_columns].values.flatten())
Encoded_Array = (Label_Encoder.transform(dataframe[label_encoded_columns].values.flatten())).reshape(dataframe[label_encoded_columns].shape)

LE_Dataframe=pd.DataFrame(Encoded_DataFrame,columns=label_encoded_columns,index=dataframe.index)
LE_mapping = dict(zip(Label_Encoder.classes_,Label_Encoder.transform(Label_Encoder.classes_).tolist()))
 #####This should give you dictionary in the form for all your list of values.
 ##### for eg: {'Apple':0,'Banana':1}

对于问题的第二部分,可以有两种方法。 第一个非常简单,其中您可以使用X_test的值来给出预测结果。 model.predict(X_test.iloc [0:30])###前30行 model.predict_proba(X_test.iloc [0:30])

在第二篇中,如果您要谈论引入新数据,那么在这种情况下,您将不得不再次对原始数据进行标签编码。

如果该数据不存在,则可能会给您带来值错误之前从未见过的情况。

在这种情况下,请参阅此link