Я пытаюсь поиграть в построение модели машинного обучения, и результаты действительно плохие, несмотря на довольно простой ответ. Я знаю, что делаю что-то не так, но не знаю, где.
Вот что я делаю:
- У меня есть набор данных по корпоративным финансам.
- Чтобы упростить процесс, я пытаюсь предсказать валовую прибыль (общий доход - стоимость выручки)
- , чтобы упростить процесс. Я фактически вычисляю это значение в столбец pandas. я
df['grossProfit'] = df['totalRevenue'] - df['costOfRevenue']
- Чтобы сделать это немного сложнее, у меня есть столбец, называемый 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)
Я уверен, что где-то совершаю большую ошибку, я просто новичок в машинном обучении, поэтому я не точно уверен, где.