有一个代码段,火车是形状为(10000,24)
的数据框。我不太了解具体的代码行X_train = train[msk].iloc[:,features]
。 train[mask]
打算做什么?
train = pandas.read_csv(train_file)
msk = np.random.rand(len(train)) < 0.8
features = [3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23]
X_train = train[msk].iloc[:,features]
答案 0 :(得分:0)
这是将数据集train
分成大约80-20的非常无效的方法。它会创建一个布尔数组,其中的true和true分别约为80%和80%。
为了说明,请举这个玩具示例:
# Create a train dataframe
train = pd.DataFrame(np.random.random((10,4)))
>>> train
0 1 2 3
0 0.514717 0.570628 0.315088 0.610563
1 0.070222 0.392518 0.222532 0.316044
2 0.002166 0.628661 0.871658 0.919967
3 0.487811 0.948827 0.862359 0.288661
4 0.473024 0.143987 0.318512 0.180763
5 0.438993 0.060274 0.603310 0.643926
6 0.115308 0.797109 0.716390 0.385135
7 0.591124 0.772243 0.185121 0.775700
8 0.994233 0.126579 0.560132 0.424696
9 0.417475 0.778452 0.403525 0.510491
# Create your mask
mask = np.random.rand(10) < 0.8
>>> mask
array([ True, True, True, True, False, False, False, True, True,
True])
如您所见,mask大约为 80%True,因为它会创建一个介于0和1之间的随机统一值数组,然后查找这些值在0.8
以上的位置。由于它们是随机均匀分布的,因此大约80%的值将高于0.8
。
然后,您的代码用这些布尔值屏蔽数据框的选定列,选择掩码中索引等于True
的那些行:
# Select relevant features
features = [0,1,2]
# Mask the relevant features of train dataframe with your mask
X_train = train[mask].iloc[:,features]
>>> X_train
0 1 2
0 0.514717 0.570628 0.315088
1 0.070222 0.392518 0.222532
2 0.002166 0.628661 0.871658
3 0.487811 0.948827 0.862359
7 0.591124 0.772243 0.185121
8 0.994233 0.126579 0.560132
9 0.417475 0.778452 0.403525
请注意,如何只选择掩码中索引为True
的行。它省略了第4、5和6行,因为这些索引在掩码中为False
。同样,它仅选择我们在features
中选择的列。
更好的方法是使用train_test_split
中的sklearn
。或者,您可以只使用train[features].sample(frac=0.8)
,它会做同样的事情,但是至少保证80%的分割:
>>> train[features].sample(frac=0.8)
0 1 2
3 0.487811 0.948827 0.862359
7 0.591124 0.772243 0.185121
2 0.002166 0.628661 0.871658
9 0.417475 0.778452 0.403525
6 0.115308 0.797109 0.716390
1 0.070222 0.392518 0.222532
4 0.473024 0.143987 0.318512
0 0.514717 0.570628 0.315088