gpt4 book ai didi

tensorflow - 为什么我在使用 Keras 与随机森林或 knn 时得到了糟糕的结果?

转载 作者:行者123 更新时间:2023-12-03 18:36:33 26 4
gpt4 key购买 nike

我正在使用 keras 学习深度学习,并尝试将结果(准确性)与机器学习算法( sklearn )(即 random forestk_neighbors )进行比较

似乎使用 keras 我得到了最糟糕的结果。
我正在研究简单的分类问题:iris dataset我的 keras 代码如下:

samples = datasets.load_iris()
X = samples.data
y = samples.target
df = pd.DataFrame(data=X)
df.columns = samples.feature_names
df['Target'] = y

# prepare data
X = df[df.columns[:-1]]
y = df[df.columns[-1]]

# hot encoding
encoder = LabelEncoder()
y1 = encoder.fit_transform(y)
y = pd.get_dummies(y1).values

# split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3)

# build model
model = Sequential()
model.add(Dense(1000, activation='tanh', input_shape = ((df.shape[1]-1),)))
model.add(Dense(500, activation='tanh'))
model.add(Dense(250, activation='tanh'))
model.add(Dense(125, activation='tanh'))
model.add(Dense(64, activation='tanh'))
model.add(Dense(32, activation='tanh'))
model.add(Dense(9, activation='tanh'))
model.add(Dense(y.shape[1], activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train)
score, acc = model.evaluate(X_test, y_test, verbose=0)

#results:
#score = 0.77
#acc = 0.711

我已经厌倦了添加层和/或更改每层的单元数和/或更改激活函数(到 relu ),结果似乎不高于 0.85。

使用 sklearn random forestk_neighbors 我得到的结果(在同一数据集上)高于 0.95。
  • 我错过了什么?
  • 使用 sklearn 我做了很少的努力并获得了不错的结果,使用 keras ,我进行了很多升级,但不如 sklearn 的结果。这是为什么 ?
  • 如何使用 keras 获得相同的结果?
  • 最佳答案

    简而言之,您需要:

  • ReLU 激活
  • 更简单的模型
  • 数据规范化
  • 更多时代

  • 详细:
    这里的第一个问题是,现在我们 从不 activation='tanh' 用于中间网络层。在此类问题中,我们几乎总是使用 activation='relu'
    第二个问题是你已经建立了一个相当大的 Keras 模型,很可能你的训练集中只有 100 个虹膜样本,你的 数据太少,无法有效训练如此大的模型。尝试大幅减少层数和每层节点数。开始更简单。
    当我们拥有大量数据时,大型神经网络确实会蓬勃发展,但在像这里这样的小型数据集的情况下,与更简单的算法(如 RF 或 k-nn)相比,它们的表现力和灵活性可能会成为不利因素。
    第三个问题是,与基于树的模型(如随机森林)相比,神经网络通常需要对数据进行归一化,而您不需要这样做。事实是 knn 也需要归一化数据,但在这种特殊情况下,由于所有虹膜特征都在同一尺度上,因此不会对性能产生负面影响。
    最后但并非最不重要的一点是,您似乎只在一个时期内运行 Keras 模型(如果您没有在 model.fit 中指定任何内容,则为默认值);这有点相当于用一棵树(顺便说一句,仍然是 much better than a single decision tree )构建一个随机森林。
    总而言之,在您的代码中进行以下更改:
    from sklearn.preprocessing import StandardScaler
    sc = StandardScaler()
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)

    model = Sequential()
    model.add(Dense(150, activation='relu', input_shape = ((df.shape[1]-1),)))
    model.add(Dense(150, activation='relu'))
    model.add(Dense(y.shape[1], activation='softmax'))

    model.fit(X_train, y_train, epochs=100)
    和其他一切一样,我们得到:
    score, acc = model.evaluate(X_test, y_test, verbose=0)
    acc
    # 0.9333333373069763
    我们可以做得更好:使用稍微多一些的训练数据并将它们分层,即
    X_train, X_test, y_train, y_test = train_test_split(X, y, 
    test_size = 0.20, # a few more samples for training
    stratify=y)
    使用相同的模型和训练时期,您可以在测试集中获得 完美的 准确度 1.0:
    score, acc = model.evaluate(X_test, y_test, verbose=0)
    acc
    # 1.0
    (由于此类实验中默认强加的一些随机性,细节可能会有所不同)。

    关于tensorflow - 为什么我在使用 Keras 与随机森林或 knn 时得到了糟糕的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61234347/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com