简单机器模型的准确性差?如何调试?

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

这是我正在做的事情:

  1. 我有一个公司财务数据集。
  2. 为了简化,我试图预测毛利润(总收入 – 收入成本)。
  3. 为了更简单,我实际上是自己计算这个值并将其添加到pandas列中 df['grossProfit'] = df['totalRevenue'] - df['costOfRevenue']
  4. 为了增加一点挑战,我有一个名为exchange的列,它是一个以数字格式表示的类别(1,2,3等)。

我的目标是简单地预测毛利润,我原本以为这会很容易,因为100%的数据计算都在我的数据集中,但当我运行模型时,准确率最高只有6%。我期望它应该接近100%,因为模型应该能算出总收入 – 收入成本 = 毛利润。

这是我的数据:

    grossProfit totalRevenue    Exchange    costOfRevenue0   9.839200e+10    2.601740e+11    NASDAQ  1.617820e+111   9.839200e+10    2.601740e+11    NASDAQ  1.617820e+112   1.018390e+11    2.655950e+11    NASDAQ  1.637560e+113   1.018390e+11    2.655950e+11    NASDAQ  1.637560e+114   8.818600e+10    2.292340e+11    NASDAQ  1.410480e+11... ... ... ... ...186 4.224500e+10    9.113400e+10    NYSE    4.888900e+10187 4.078900e+10    9.629300e+10    NYSE    5.550400e+10188 3.748200e+10    8.913100e+10    NYSE    5.164900e+10189 3.397500e+10    8.118600e+10    NYSE    4.721100e+10190 3.597700e+10    8.586600e+10    NYSE    4.988900e+10191 rows × 4 columns

这是我用于标准化/缩放数据的代码:

df['grossProfit'] = df['totalRevenue'] - df['costOfRevenue'] #非常糟糕,尽快删除,仅用于测试variableToPredict = ['grossProfit']df2=df[['grossProfit','totalRevenue','Exchange', 'costOfRevenue']]#缩放数据#隔离数据PredictionDataSet=df2[df2[variableToPredict].notnull().all(1)] #不包含缺失值 X_missing=df2[df2[variableToPredict].isnull().all(1)]  #---> 包含缺失值 #收集数值/类别对象columnsNumeric = list(PredictionDataSet.select_dtypes(include=['float']).columns)columnsObjects = list(PredictionDataSet.select_dtypes(include=['object']).columns)#缩放类别encoder = OrdinalEncoder()PredictionDataSet["Exchange"] = encoder.fit_transform(PredictionDataSet.Exchange.values.reshape(-1, 1))#创建测试/训练数据集X_train=PredictionDataSetX_train = X_train.drop(columns=variableToPredict)y_train=PredictionDataSet[variableToPredict]#转换输入特征PredictionDataSet[columnsNumeric] = MinMaxScaler().fit_transform(PredictionDataSet[columnsNumeric])#转换输入特征scaler_features = MinMaxScaler()scaler_features.fit(X_train)X_train = scaler_features.transform(X_train)#转换输入值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("输入特征的形状: {} ".format(X_train.shape))print("输入目标值的形状 : {} ".format(y_train.shape))numInputColumns = X_train.shape[1]Shape of input features: (191, 3) Shape of input target values : (191, 1) 3

这是我的模型:

###### modelmodel = tf.keras.Sequential() #使用tensorflow kerasmodel.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. 您处于一个回归设置中,准确性是无意义的(它仅用于分类问题)。从您的模型编译中移除 metrics=['accuracy'] 并且不要关心它 – 您应该使用与损失相同的量(这里是MSE)来评估模型的性能。

  2. 由于同样的原因(回归问题),您不应该在最后一层使用 sigmoid 激活,而应该使用 linear 激活(只保留 Dense(1) 也可以,因为 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')

当您完成这一部分后,您最终会得出不幸的结论,与分类问题不同,我们无法立即判断回归问题的性能指标(如MSE)是“好”,“不够好”,“差”等;更糟糕的是,您的MSE是在您的缩放y 数据上计算的。阅读我在 如何解释Keras回归器中的MSE 的回答,了解如何在您初始的、未缩放的数据上计算MSE,取其平方根,从而能够在您原始数据的单位中进行比较,以判断它是否对您的情况满意(这是ML教程中通常省略的部分)…

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注