机器学习中测试集是否需要数据清洗?
Does the test set need data cleaning in machine learning?
我正在进行一个关于纽约出租车数据的有趣机器学习项目 (https://s3.amazonaws.com/nyc-tlc/trip+data/green_tripdata_2017-04.csv),目标是预测小费金额,原始数据看起来像(2 个数据样本):
VendorID lpep_pickup_datetime lpep_dropoff_datetime store_and_fwd_flag \
0 2 2017-04-01 00:03:54 2017-04-01 00:20:51 N
1 2 2017-04-01 00:00:29 2017-04-01 00:02:44 N
RatecodeID PULocationID DOLocationID passenger_count trip_distance \
0 1 25 14 1 5.29
1 1 263 75 1 0.76
fare_amount extra mta_tax tip_amount tolls_amount ehail_fee \
0 18.5 0.5 0.5 1.00 0.0 NaN
1 4.5 0.5 0.5 1.45 0.0 NaN
improvement_surcharge total_amount payment_type trip_type
0 0.3 20.80 1 1.0
1 0.3 7.25 1 1.0
有五种不同的'payment_type',用数字1,2,3,4,5表示
我发现只有当'payment_type'为1时,'tip_amount'才有意义,'payment_type'2,3,4,5都是零小费:
for i in range(1,6):
print(raw[raw["payment_type"] == i][['tip_amount', 'payment_type']].head(2))
给出:
tip_amount payment_type
0 1.00 1
1 1.45 1
tip_amount payment_type
5 0.0 2
8 0.0 2
tip_amount payment_type
100 0.0 3
513 0.0 3
tip_amount payment_type
59 0.0 4
102 0.0 4
tip_amount payment_type
46656 0.0 5
53090 0.0 5
第一个问题:我想为 'tip_amount' 建立一个回归模型,如果我使用 'payment_type' 作为特征,模型可以自动处理这种行为吗?
第二个问题:我们知道 'tip_amount' 对于 'payment_type' 2,3,4,5 实际上不是零,只是没有被正确记录,如果我删除这些数据样本并只保留'payment_type' == 1,那么当使用模型用于未见过的测试数据集时,它无法预测 'payment_type' 2,3,4,5 到零提示,所以我必须保留 'payment_type' 作为一项重要功能吧?
第三个问题:假设我保留了所有不同的 'payment_type' 数据样本,并且该模型能够预测 'payment_type' 2,3,4,5 的零小费金额,但这是我们真正想要的吗想?因为潜在的真实小费不应该为零,这就是数据的样子。
机器学习的俗语是垃圾进,垃圾出。通常,特征选择和数据预处理比模型架构更重要。
第一个问题:
是
第二个问题:
既然2、3、4、5的payment_type的结果都是0,为什么不简单点呢。将所有非 1 的付款类型替换为 0。这将使您的模型轻松地将 1 与已付款相关联,将 0 与未付款相关联。它还减少了您的模型将来必须学习的东西的数量。
第三题:
如果 "underlying true tip" 没有反映在数据中,那么你的模型根本不可能学习它。这种对事实的不准确表述是否是我们想要的,由您来决定。理想情况下,您会有显示实际小费的数据。
预处理您的数据非常重要,它将极大地帮助您的模型。除了对 payment_type 功能进行一些更改外,您还应该考虑对数据进行规范化,这将有助于您的机器学习算法更好地概括数据之间的关系。
我正在进行一个关于纽约出租车数据的有趣机器学习项目 (https://s3.amazonaws.com/nyc-tlc/trip+data/green_tripdata_2017-04.csv),目标是预测小费金额,原始数据看起来像(2 个数据样本):
VendorID lpep_pickup_datetime lpep_dropoff_datetime store_and_fwd_flag \
0 2 2017-04-01 00:03:54 2017-04-01 00:20:51 N
1 2 2017-04-01 00:00:29 2017-04-01 00:02:44 N
RatecodeID PULocationID DOLocationID passenger_count trip_distance \
0 1 25 14 1 5.29
1 1 263 75 1 0.76
fare_amount extra mta_tax tip_amount tolls_amount ehail_fee \
0 18.5 0.5 0.5 1.00 0.0 NaN
1 4.5 0.5 0.5 1.45 0.0 NaN
improvement_surcharge total_amount payment_type trip_type
0 0.3 20.80 1 1.0
1 0.3 7.25 1 1.0
有五种不同的'payment_type',用数字1,2,3,4,5表示
我发现只有当'payment_type'为1时,'tip_amount'才有意义,'payment_type'2,3,4,5都是零小费:
for i in range(1,6):
print(raw[raw["payment_type"] == i][['tip_amount', 'payment_type']].head(2))
给出:
tip_amount payment_type
0 1.00 1
1 1.45 1
tip_amount payment_type
5 0.0 2
8 0.0 2
tip_amount payment_type
100 0.0 3
513 0.0 3
tip_amount payment_type
59 0.0 4
102 0.0 4
tip_amount payment_type
46656 0.0 5
53090 0.0 5
第一个问题:我想为 'tip_amount' 建立一个回归模型,如果我使用 'payment_type' 作为特征,模型可以自动处理这种行为吗?
第二个问题:我们知道 'tip_amount' 对于 'payment_type' 2,3,4,5 实际上不是零,只是没有被正确记录,如果我删除这些数据样本并只保留'payment_type' == 1,那么当使用模型用于未见过的测试数据集时,它无法预测 'payment_type' 2,3,4,5 到零提示,所以我必须保留 'payment_type' 作为一项重要功能吧?
第三个问题:假设我保留了所有不同的 'payment_type' 数据样本,并且该模型能够预测 'payment_type' 2,3,4,5 的零小费金额,但这是我们真正想要的吗想?因为潜在的真实小费不应该为零,这就是数据的样子。
机器学习的俗语是垃圾进,垃圾出。通常,特征选择和数据预处理比模型架构更重要。
第一个问题:
是
第二个问题:
既然2、3、4、5的payment_type的结果都是0,为什么不简单点呢。将所有非 1 的付款类型替换为 0。这将使您的模型轻松地将 1 与已付款相关联,将 0 与未付款相关联。它还减少了您的模型将来必须学习的东西的数量。
第三题:
如果 "underlying true tip" 没有反映在数据中,那么你的模型根本不可能学习它。这种对事实的不准确表述是否是我们想要的,由您来决定。理想情况下,您会有显示实际小费的数据。
预处理您的数据非常重要,它将极大地帮助您的模型。除了对 payment_type 功能进行一些更改外,您还应该考虑对数据进行规范化,这将有助于您的机器学习算法更好地概括数据之间的关系。