MLHW2-tips
徐徐 抱歉选手

文件类型

原始数据给的是CSV格式,但是经过助教整理,解压缩后是不带后缀名的UNIX可执行文件。

如何确定一个文件的类型?在终端使用file <path>命令就可以获得文件类型。终端显示助教给的文件是ASCII text,是用ASCII编码的纯文本文件,可以用任何文本编辑器打开。

同时打开txt文本编辑器,把文件拖动到其中就可以获得文件路径。

从文件提取数据

首先保存数据路径,再从用with open(Path-for-XY) as f读取数据。

保存数据路径,可以给定路径,也可以用{}表示不定路径,在使用不定路径的时候一定要format语句with open(output_path.format('logistic'), 'w') as f:

1
2
X_test_fpath = './Dataset2/X_test'
output_path = './output_{}.scv'

读取数据要对数据的换行符和分隔符做处理,才能把数据放到numpy array中。strip在每一笔数据之间删除换行符;split函数在每一笔数据中删除每一个维度/feature上的分隔符。

在读取数据的时候要注意是否存在head,next(f)就是跳过头部。

1
2
3
4
5
with open(X_train_fpath) as f:
next(f)
# 跳过第一行的列说明
X_train = np.array([line.strip('\n').split(',')[1:] for line in f], dtype=float)
# strip用于忽略换行之类的,split用于根据标记分离单独的数据

训练TIPS

交叉验证集

利用矩阵的slice实现验证集和交叉集的分割,从dev_ratio获得train_size

在完成分割后检查一下X_train/Y_train/X_dev/Y_dev的size和dim,调用shape函数,该函数返回一个list。

1
2
3
4
test_size = X_test.shape[0]
data_dim = X_train.shape[1]
print('Size of testing set: {}'.format(test_size))
print('Dimension of data: {}'.format(data_dim))

Shuffling

目的是把每笔数据的顺序打乱,标签还是对应原来数据的。

最后return的是用一个索引去索引另一个索引。 numpy-array[numpy-array] or numpy-array[list]是可行的,但list[numpy-array]就会报错,索引时尽可能使用numpy数组。

参考TypeError: only integer scalar arrays can be converted to a scalar index的处理方法

1
2
3
4
5
6
7
8
9
def _shuffle(X, Y):
randomize = np.arange(len(X))
np.random.shuffle(randomize)
return (X[randomize], Y[randomize])
# 如果X和Y都是List,即我们在test它的性能时使用np.array(list-item)作为输入就不会报错
# print(_shuffle(np.array([1,2,3,4]), np.array([1,1,0,4])))
# 用numpy数组去索引List会报错Only integer scalar arrays can be converted to a scalar index
# numpy.random.shuffle会改变传入原来传入的numpy数组
# 一般讲要索引的target转换成numpy数组进行操作,尽可能将数据类型转换为numpy数组处理

截断防溢出

1
np.clip(1 / (1.0 + np.exp(-z)), 1e-8, 1 - (1e-8))

对有逼近/渐近线的函数做截断。

预测输出的转换

在求解交叉熵的时候用的是最原始的预测输出(也就是通过sigmoid function后的01范围内的概率),但是在计算预测准确度的时候,要把预测输出用round转换为布尔值。

1
2
3
4
y_dev_pred = _f(X_dev, w, b)
Y_dev_pred = np.round(y_dev_pred)
dev_acc.append(_accuracy(Y_dev_pred, Y_dev))
dev_loss.append(_cross_entropy_loss(y_dev_pred, Y_dev) / dev_size)

数组操作

转置

  • 使用X.T属性,适用于一维和二维数组
  • 使用X.transpose()方法,对于高维数组需要由轴编号组成的元组才能依据轴转置。

相乘

np.dot(X1, X2)或者X1.dot(X2)

参考

李宏毅2020机器学习作业2-Classification:年收入二分类

课程助教上传的Colab文件

  • 本文标题:MLHW2-tips
  • 本文作者:徐徐
  • 创建时间:2020-11-08 20:08:40
  • 本文链接:https://machacroissant.github.io/2020/11/08/MLHW2-tips/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论