【问题标题】:Why am I getting "1" as the class predicted all the time?为什么我总是像班级预测的那样得到“1”?
【发布时间】:2019-06-21 01:44:43
【问题描述】:

我有this CSV file,我试图根据其他行中的数据预测Histology

我有下面显示的代码来做到这一点。但是,我得到的所有预测都是1。这是为什么?虽然我在训练模型后得到的准确度是86.81%

import numpy as np 
import pandas as pd 
from keras.layers import Dense, Dropout, BatchNormalization, Activation
import keras.models as md
import keras.layers.core as core
import keras.utils.np_utils as kutils
import keras.layers.convolutional as conv

from keras.layers import MaxPool2D

from subprocess import check_output
dataset = pd.read_csv('mutation-train.csv')

dataset = dataset[['CDS_Mutation',
                   'Primary_Tissue',
                    'Genomic',
                    'Gene_ID',
                    'Official_Symbol',
                    'Histology']]

X = dataset.iloc[:,0:5].values
y = dataset.iloc[:,5].values

# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_0 = LabelEncoder()
X[:, 0] = labelencoder_X_0.fit_transform(X[:, 0])
labelencoder_X_1 = LabelEncoder()
X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])
labelencoder_X_2= LabelEncoder()
X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])
labelencoder_X_4= LabelEncoder()
X[:, 4] = labelencoder_X_4.fit_transform(X[:, 4])

X = X.astype(float)
labelencoder_y= LabelEncoder()
y = labelencoder_y.fit_transform(y)

onehotencoder0 = OneHotEncoder(categorical_features = [0])
X = onehotencoder0.fit_transform(X).toarray()
X = X[:,0:]
onehotencoder1 = OneHotEncoder(categorical_features = [1])
X = onehotencoder1.fit_transform(X).toarray()
X = X[:,0:]
onehotencoder2 = OneHotEncoder(categorical_features = [2])
X = onehotencoder2.fit_transform(X).toarray()
X = X[:,0:]
onehotencoder4 = OneHotEncoder(categorical_features = [4])
X = onehotencoder4.fit_transform(X).toarray()
X = X[:,0:]

# Splitting the dataset training 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.2)

# Feature scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# Evaluating the ANN
from sklearn.model_selection import cross_val_score
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout

model=Sequential()
model.add(Dense(32, activation = 'relu', input_shape=(X.shape[1],)))
model.add(Dense(16, activation = 'relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ["accuracy"])

# Compile model
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
# Fit the model
model.fit(X,y, epochs=3, batch_size=1)

# Evaluate the model
scores = model.evaluate(X,y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

# Calculate predictions
predictions = model.predict(X)
prediction = pd.DataFrame(predictions,columns=['predictions']).to_csv('prediction.csv')

谢谢。

【问题讨论】:

  • 我认为您的数据不平衡。
  • @Sociopath 感谢您的友好回复。你能澄清一下你的观点吗?这种情况我该怎么办?
  • model.fit 有一个 class_weight 参数,或许可以尝试为次要类分配更高的权重。
  • @Simplicity 看看我的回答。

标签: python pandas csv numpy keras


【解决方案1】:

当所有值都为 1 的情况下,您获得了 86.81% 的准确率,您的数据似乎不平衡,这意味着在您的训练数据集中,其中一个类超过了另一个。 因此,即使您对所有测试数据进行预测 1,您也将获得更高的准确度。

参考Accuracy paradox

例如。在您的数据集中,大约 85% 的数据样本属于 1 类,其余属于 0 类。

如何处理

有很多方法可以处理它。

  1. 上采样:为 0 类创建重复数据,以便 1 类和 0 类具有相同的比例。
  2. 下采样:只需从 1 类中删除一些样本即可获得相同的比例。
  3. 更改性能矩阵:而不是使用精度作为性能矩阵使用, F1 分数、准确率或召回率
  4. 您可以对犯错的不同班级分配不同的惩罚。在这种情况下,您会为数据量少的类赋予高权重。

还有更多的方法来处理它。

请参阅this link 了解更多详情。

【讨论】:

    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 2013-09-17
    • 2021-09-07
    相关资源
    最近更新 更多