具有概率目标的决策树
Decision tree with a probability target
我目前正在开发一个模型来预测一个人感染冠状病毒后的死亡概率。
我正在使用带有分类变量的荷兰数据集:感染日期、死亡或治愈、性别、年龄组等。
建议使用我已经构建的决策树。
由于我是决策树的新手,所以我需要一些帮助。
我希望用概率 (%) 表示预测(目标变量),而不是二进制输出。
我怎样才能做到这一点?
此外,我想通过自己输入数据来玩弄样本,看看结果是什么。
例如:让我们以 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)
决策树还可以估计一个实例属于特定class的概率。使用下面的 predict_proba() 和你的火车特征数据来 return 你想要预测的各种 class 的概率。 model.predict() returns class 概率最高
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
我目前正在开发一个模型来预测一个人感染冠状病毒后的死亡概率。 我正在使用带有分类变量的荷兰数据集:感染日期、死亡或治愈、性别、年龄组等。 建议使用我已经构建的决策树。 由于我是决策树的新手,所以我需要一些帮助。 我希望用概率 (%) 表示预测(目标变量),而不是二进制输出。 我怎样才能做到这一点? 此外,我想通过自己输入数据来玩弄样本,看看结果是什么。 例如:让我们以 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)
决策树还可以估计一个实例属于特定class的概率。使用下面的 predict_proba() 和你的火车特征数据来 return 你想要预测的各种 class 的概率。 model.predict() returns class 概率最高
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