首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >决策树模型和随机森林模型的输出是不同的。

决策树模型和随机森林模型的输出是不同的。
EN

Data Science用户
提问于 2019-11-02 00:30:31
回答 2查看 223关注 0票数 3

我已经建立了一个使用决策树和随机森林的模型。但是,当我试图在同一个DataFrame上测试模型时,输出是不同的。这怎麽可能?

我回购的数据文件

代码语言:javascript
复制
#This is the function to help me preparing the dataframe
def process_df_for_ml(df):
    """
    Process a dataframe for model training/prediction use.

    Returns X/y tensors.
    """

    df = df.copy()
    # Map salary to 0,1,2
    df.salary = df.salary.map({"low": 0, "medium": 1, "high": 2})
    # dropping left and sales X for the df, y for the left
    X = df.drop(["left", "sales"], axis=1)
    y = df["left"]
    return (X, y)

我使用了决策树:

代码语言:javascript
复制
from sklearn import tree
from sklearn.model_selection import train_test_split
# Train a decision tree.
X, y = process_df_for_ml(df)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, stratify=y)
clftree = tree.DecisionTreeClassifier(max_depth=3)
clftree.fit(X_train, y_train)

用test_score: 0.96。之后,我将这个DecisionTree测试到相同的df,得到的输出是424行x11列。

然后我尝试使用随机森林算法。

代码语言:javascript
复制
X, y = process_df_for_ml(df)

from sklearn.model_selection import train_test_split
# implementing train-test-split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0, stratify=y)

from sklearn.ensemble import RandomForestClassifier
# random forest model creation
rfc = RandomForestClassifier()
rfc.fit(X_train,y_train)
# predictions
rfc_predict = rfc.predict(X_test)

使用test_score: 0.99。之后,我将这个RandomForest测试到相同的df中,得到的输出是11行x11列。

这怎麽可能?以下是我作品的链接:DecisionTreeRandomForest

EN

回答 2

Data Science用户

回答已采纳

发布于 2020-05-20 23:13:51

1.数据准备

默认情况下,如果您没有为train_test_splittrain_size参数声明不同的内容,那么test_size:test将假定为75:25。看这里

对于您的决策树,您不声明这个,所以您在25%的数据上进行测试,而在为随机森林算法准备的数据准备中明确指出,训练的大小应该是33%。

纠正这一点可以确保在此场景中对这两种算法进行公平的比较。我假设您希望使用test_size=0.33

2.模型差异

随机森林分类器是一种集成方法。顾名思义,该方法生成了一个由多个决策树分类器组成的“林”,每个分类器根据训练数据对不同的样本子集和特征进行训练。n_estimatorsmax_samplesmax_features参数控制这一点。看这里。然后对每棵树的结果进行平均,目的是提供一个更稳健的估计器。

为了使这两个分类器产生相同的输出,我可以设置相同的random_statemax_depth,同时允许在随机林中使用所有特性(因为默认情况下,在生成的每个树中都使用所有样本):

代码语言:javascript
复制
tree.DecisionTreeClassifier(random_state=0, max_depth=3)
ensemble.RandomForestClassifier(random_state=0, max_depth=3, max_features=None)

由于两个分类器都生成相同的树,所以两者现在都达到了相同的测试精度0.9551。

删除max_features=None允许随机林分类器为随机林中的每个树训练的每个子集随机选择特征:

代码语言:javascript
复制
ensemble.RandomForestClassifier(random_state=0, max_depth=3)

结果表明,随机森林分类器的测试精度达到了0.9121。

希望这能解释为什么决策树和随机森林分类器会得到不同的结果。

票数 1
EN

Data Science用户

发布于 2019-11-08 06:34:13

df行数为14 999。

您的测试数据为33% ~ 4950。

因此,您的y_predict应该是(4950,1),即对所有测试行的二进制预测。

这是我在运行您的代码时得到的,您已经在这里发布了。

代码语言:javascript
复制
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/bhaskoro-muthohar/DataScienceLearning/master/HR_comma_sep.csv')

print(df.size)
# Map salary to 0,1,2
df.salary = df.salary.map({"low": 0, "medium": 1, "high": 2})
# dropping left and sales X for the df, y for the left
X = df.drop(["left", "sales"], axis=1)
y = df["left"]

#splitting the train and test sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0, stratify=y)
# Train a decision tree.
from sklearn.tree import DecisionTreeClassifier
clftree = DecisionTreeClassifier(max_depth=3)
clftree.fit(X_train, y_train)
y_pred = clftree.predict(X_test) 
print(y_pred.size)
from sklearn.ensemble import RandomForestClassifier
# random forest model creation
rfc = RandomForestClassifier()
rfc.fit(X_train,y_train)
# predictions
rfc_predict = rfc.predict(X_test)
print(rfc_predict.size)
票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/62556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档