简单机型的精度差?如何调试?

2024-10-03 02:41:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试构建一个机器学习模型,结果非常糟糕,尽管答案相当简单。我知道我做错了什么,但不知道在哪里

以下是我正在做的:

  1. 我有一套公司财务数据
  2. 为了方便起见,我试图预测毛利润(总收入-收入成本)
  3. 为了使它更容易,我实际上是自己将该值计算到pandas列中df['grossProfit'] = df['totalRevenue'] - df['costOfRevenue']
  4. 为了让它更具挑战性,我有一个名为exchange的专栏,它是一个数字格式的类别(1、2、3等)

我的目标是简单地预测grossProfit,我认为这很容易,因为100%的数据都计算在我的数据集中,但当我运行模型时,我得到了6%的准确率。我预计这将接近100%,因为模型应该计算出总收入+收入成本=总利润

以下是我的数据:

    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)

我肯定我在某个地方犯了一些大错误,我只是刚刚接触机器学习,所以我不确定我到底在哪里


Tags: thedfinputmodeltrainfitfeaturesvalues
1条回答
网友
1楼 · 发布于 2024-10-03 02:41:53

首先:

  1. 您处于回归设置中,其中accuracy is meaningless(它仅用于分类问题)。从模型编译中删除metrics=['accuracy'],不要为此操心-您应该使用与损失相同的数量(这里是MSE)来评估模型的性能

  2. 出于同样的原因(回归问题),您不应该对最后一层使用sigmoid激活,而应该使用linear激活(与Dense(1)一样保留),因为linear是Keras层的default激活)

  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')

当你完成这一部分时,你最终会得出一个不幸的结论,即与分类问题相反,我们可以立即说准确度是否“好”、“不够好”、“不好”等,回归问题的性能指标,如MSE,不会让自己进入如此简单的评估;更糟糕的是,您的MSE是根据您的缩放y数据。阅读我在How to interpret MSE in Keras Regressor中的答案,看看如何计算初始未标度数据中的MSE,取其平方根,从而能够以原始数据的单位对其进行比较,以确定它是否符合您的情况(ML教程中通常省略的一部分)

相关问题 更多 >