Предложения о том, как улучшить точность - PullRequest
0 голосов
/ 27 марта 2020

Я недавно имею дело с API tf.estimators. У меня есть классификатор Dnn, который дает мне точность 60% в наборе данных для прогнозирования дефектов программного обеспечения JM1 из хранилища PROMISE. Я хочу улучшить производительность модели с точки зрения точности, точности и отзыва. Я разделил данные на оценку поезда и тестовые данные и произвел повторную выборку, чтобы устранить дисбаланс. Я также пытался использовать различные оптимизаторы, функции активации и т. Д. c. Вот код, который я попробовал.

CSV_COLUMNS=['loc','vg','evg','ivg','n','v','l','d','i','e','b','t','lOCode','lOComment','lOBlank','locCodeAndComment','uniq_Op','uniq_Opnd','total_Op','total_Opnd','branchCount','defects']


FEATURES = CSV_COLUMNS[0:len(CSV_COLUMNS) - 1]


LABEL = CSV_COLUMNS[len(CSV_COLUMNS) - 1]


dataset = dataset.astype(int)
X=dataset.iloc[:,:-1].values
y=dataset.iloc[:,-1].values

from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=120)
X_res, y_res = ros.fit_resample(X, y)

from sklearn.model_selection import train_test_split 
X_train, X_test, y_train, y_test = train_test_split(X_res, y_res, test_size = 0.3, random_state = 1139)

df_train = np.hstack((X_train, np.atleast_2d(y_train).T))

X_new = X_test
y_new = y_test

X_train_new, X_test_new, y_train_new, y_test_new = train_test_split(X_new, y_new, test_size = 0.3, random_state = 12)

df_eval = np.hstack((X_train_new, np.atleast_2d(y_train_new).T))
df_test = X_test_new

def make_feature_cols():
    input_columns = [tf.feature_column.numeric_column(k) for k in FEATURES]
    return input_columns


df_train = pd.DataFrame(df_train)
df_train=df_train.rename(columns={0: 'loc',1:'vg',2:'evg',3: 'ivg',4:'n',5:'v',6: 'l',7:'d',8:'i',9: 'e',10:'b',11:'t',12: 'lOCode',13:'lOComment',14:'lOBlank',15:'locCodeAndComment',16:'uniq_Op',17:'uniq_Opnd',18:'total_Op',19:'total_Opnd',20:'branchCount',21:'defects'})


df_eval = pd.DataFrame(df_eval)
df_eval=df_eval.rename(columns={0: 'loc',1:'vg',2:'evg',3: 'ivg',4:'n',5:'v',6: 'l',7:'d',8:'i',9: 'e',10:'b',11:'t',12: 'lOCode',13:'lOComment',14:'lOBlank',15:'locCodeAndComment',16:'uniq_Op',17:'uniq_Opnd',18:'total_Op',19:'total_Opnd',20:'branchCount',21:'defects'})


df_test = pd.DataFrame(df_test)
df_test=df_test.rename(columns={0: 'loc',1:'vg',2:'evg',3: 'ivg',4:'n',5:'v',6: 'l',7:'d',8:'i',9: 'e',10:'b',11:'t',12: 'lOCode',13:'lOComment',14:'lOBlank',15:'locCodeAndComment',16:'uniq_Op',17:'uniq_Opnd',18:'total_Op',19:'total_Opnd',20:'branchCount'})



# information display while executing
tf.logging.set_verbosity(tf.logging.INFO)

# Creating the directory
OUTDIR = r'C:\Users\dell\Downloads\jm_serial2'
shutil.rmtree(OUTDIR, ignore_errors = True) 
# Start fresh each time


myopt = tf.train.AdamOptimizer(learning_rate=0.001)


model = tf.estimator.DNNClassifier(feature_columns = make_feature_cols(), 
                               model_dir = OUTDIR, hidden_units=[20, 20], 
                               n_classes=2, optimizer = myopt, dropout=0.2,
                               activation_fn = tf.math.sigmoid)


def make_input_fn(df, num_epochs):
     return tf.estimator.inputs.pandas_input_fn(x = df, y = df[LABEL], shuffle = False, num_epochs = num_epochs)


model.train(input_fn = make_input_fn(df_train, num_epochs = 100))

ev = model.evaluate(input_fn = make_input_fn(df_eval, num_epochs = 1))
print(ev)

Редактировать: Это значения результата, которые я получил.

accuracy = 0.60916734,
accuracy_baseline = 0.5104421, 
auc = 0.6360657, 
auc_precision_recall = 0.6398728, 
average_loss = 0.66607034, 
global_step = 1921, 
label/mean = 0.5104421, 
loss = 84.6828, 
precision = 0.669746, 
prediction/mean = 0.487086, 
recall = 0.46227416

Кто-нибудь может подсказать, что нужно сделать, чтобы улучшить производительность модели?

...