Плохая точность на простой модели машины? Как я могу отладить? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь поиграть в построение модели машинного обучения, и результаты действительно плохие, несмотря на довольно простой ответ. Я знаю, что делаю что-то не так, но не знаю, где.

Вот что я делаю:

  1. У меня есть набор данных по корпоративным финансам.
  2. Чтобы упростить процесс, я пытаюсь предсказать валовую прибыль (общий доход - стоимость выручки)
  3. , чтобы упростить процесс. Я фактически вычисляю это значение в столбец pandas. я df['grossProfit'] = df['totalRevenue'] - df['costOfRevenue']
  4. Чтобы сделать это немного сложнее, у меня есть столбец, называемый exchange, который представляет собой категорию в числовом формате (1,2,3, et c).

Моя цель состоит в том, чтобы просто предсказать grossProfit, что, как мне показалось, было бы легко, поскольку 100% данных рассчитывают, что оно находится в моем наборе данных, но когда я запускаю модель, я получаю точность до 6%. Я ожидаю, что это будет ближе к 100%, так как модель должна вычислять totalRevenue + Стоимость дохода = валовая прибыль.

Вот мои данные:

    grossProfit totalRevenue    Exchange    costOfRevenue
0   9.839200e+10    2.601740e+11    NASDAQ  1.617820e+11
1   9.839200e+10    2.601740e+11    NASDAQ  1.617820e+11
2   1.018390e+11    2.655950e+11    NASDAQ  1.637560e+11
3   1.018390e+11    2.655950e+11    NASDAQ  1.637560e+11
4   8.818600e+10    2.292340e+11    NASDAQ  1.410480e+11
... ... ... ... ...
186 4.224500e+10    9.113400e+10    NYSE    4.888900e+10
187 4.078900e+10    9.629300e+10    NYSE    5.550400e+10
188 3.748200e+10    8.913100e+10    NYSE    5.164900e+10
189 3.397500e+10    8.118600e+10    NYSE    4.721100e+10
190 3.597700e+10    8.586600e+10    NYSE    4.988900e+10
191 rows × 4 columns

Вот мой код для нормализации / масштабируйте данные:

df['grossProfit'] = df['totalRevenue'] - df['costOfRevenue'] #very bad REMOVE ASAP just for testing
variableToPredict = ['grossProfit']
df2=df[['grossProfit','totalRevenue','Exchange', 'costOfRevenue']]

#scale the data

#isolate the data
PredictionDataSet=df2[df2[variableToPredict].notnull().all(1)] # contains no missing values 
X_missing=df2[df2[variableToPredict].isnull().all(1)]  #---> contains missing values 

#gather numeric/catergory objects
columnsNumeric = list(PredictionDataSet.select_dtypes(include=['float']).columns)
columnsObjects = list(PredictionDataSet.select_dtypes(include=['object']).columns)

#scale catergories
encoder = OrdinalEncoder()
PredictionDataSet["Exchange"] = encoder.fit_transform(PredictionDataSet.Exchange.values.reshape(-1, 1))

#create test/train datasets
X_train=PredictionDataSet
X_train = X_train.drop(columns=variableToPredict)
y_train=PredictionDataSet[variableToPredict]

#transforming the input features
PredictionDataSet[columnsNumeric] = MinMaxScaler().fit_transform(PredictionDataSet[columnsNumeric])
#transforming the input features
scaler_features = MinMaxScaler()
scaler_features.fit(X_train)
X_train = scaler_features.transform(X_train)

#transforming the input values
scaler_values = MinMaxScaler()
y_train=np.asarray(y_train).reshape(-1,1)
scaler_values.fit(y_train)
y_train=scaler_values.transform(y_train)

print("Shape of input features: {} ".format(X_train.shape))
print("Shape of input target values : {} ".format(y_train.shape))
numInputColumns = X_train.shape[1]

Shape of input features: (191, 3) 
Shape of input target values : (191, 1) 
3

Вот моя модель:

###### model

model = tf.keras.Sequential() #using tensorflow keras
model.add(layers.Dense(64, activation='relu', input_shape=(numInputColumns,)))
model.add(layers.Dense(128))
model.add(layers.Dense(128))
model.add(layers.Dense(128))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(X_train,y_train,epochs=10,validation_split=0.2)

Я уверен, что где-то совершаю большую ошибку, я просто новичок в машинном обучении, поэтому я не точно уверен, где.

1 Ответ

1 голос
/ 26 марта 2020

Для начала:

  1. Вы находитесь в параметре регрессия , где точность не имеет смысла (используется только в классификация проблем). Удалите metrics=['accuracy'] из вашей модели компиляции и не беспокойтесь об этом - вы должны оценивать производительность вашей модели с тем же количеством, которое вы используете в качестве убытка (здесь MSE).

  2. По той же причине (проблема регрессии), вы не должны использовать sigmoid активацию для вашего последнего слоя, но linear (оставляя просто как 1018 *, также сделает работу, так как linear является по умолчанию активация для слоев Keras).

  3. Промежуточные слои с линейными активациями (как у вас здесь) составляют всего один узел линейного слоя каждый (то есть практически ничего); добавьте relu активацию к всем ваших промежуточных слоев (так же, как вы делаете для первого).

В общем, вот как ваш старт точка для эксперимента должна быть:

model = tf.keras.Sequential() 
model.add(layers.Dense(64, activation='relu', input_shape=(numInputColumns,)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

Когда вы закончите с этой частью, вы в конечном итоге придете к печальному выводу, что, в отличие от проблем классификации, где мы можем сразу сказать, если точность - это «хорошо», «не достаточно хорошо», «плохо» и т. д. c. Метрики производительности проблем регрессии, таких как MSE, не позволяют проводить такие простые оценки; что еще хуже, ваш MSE рассчитывается по вашим масштабированным y данным. Прочитайте мой ответ в Как интерпретировать MSE в Keras Regressor , чтобы увидеть, как вы можете рассчитать MSE в ваших исходных немасштабированных данных, взять его квадрат root и, таким образом, иметь возможность сравнить его в единицы ваших исходных данных , чтобы увидеть, удовлетворительно ли это для вашего случая (часть, как правило, не указывается в руководствах по ML) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...