猜数字
猜出数列的下一个数字
Link: https://www.kaggle.com/c/integer-sequence-learning
题目描述
1, 2, 3, 4, 5, 7, 8, 9, 11, …… 这是一个简单的整数数列,也叫素数数列。
再比如,0, 1, 1, 2, 3, 8, 13, 21, 34, 55 这个序列的下一个数字是什么?如果你的回答是89, 那么你成功找到了这个数列的规律。但是如何让计算机也能找到这个规律?
On-Line Encyclopedia of Integer Sequences (OEIS) 是一个在线整数数列查询网站,是由世界各地的数学家经过50多年的努力编写而成。如果一个数列拥有规律,那么它很可能在OEIS中,并且还提供了更详细的说明。
本题需要你利用机器学习算法找到一个整数数列的下一个数字。换言之,就是寻找一个整数数列的规律。
小提示
- 尝试对数列进行一些可视化的分析,观察潜在的规律,如单调性,数列长度等。
- 可以采用线性回归(linear regression), 或随机森林(random forest)等分类算法。
- 由于输入是序列型的数据,还可以采用循环神经网络(Recurrent Neural Network,简称RNN)
术语解释
- Linear Regression(线性回归):线性回归是利用线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。它用一条直线(或者高维空间中的平面)来拟合训练数据,进而对未知数据进行预测。
- Random Forest(随机森林):指的是利用多棵树对样本进行训练并预测的一种分类器。在机器学习领域,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
- 循环神经网络(Recurrent Neural Network):RNN(Recurrent Neuron Network)是一种对序列数据建模的神经网络,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。
输入格式
数据集中包含OEIS中大部分整数数列,分为训练集和测试集,分别保存在train.csv和test.csv中。训练集中为完整的整数数列,而测试集中的整数数列去掉了最后一个数字,我们的任务就是预测这个去掉的数字。
训练集中一共包含90,000条记录,包括两个字段:
- Id: 该数列的唯一Id
- 数列(Sequence):数列的具体内容,其中数列的长度不唯一。
而测试集中一共包含23845条记录,对于每条记录中的数列,我们去掉了最后一个值,也就是我们需要预测的对象。
输出格式
- 提交的csv文件应采用以下格式:一共包含两列,第一列Id代表测试集中对应的数列Id,第二列Last则代表预测出的该数列最后一个数字。具体如下所示:
Id,Last
1,0
2,22
4,9378
etc.
评价
使用准确率(accuracy)作为评判标准。
$$accuracy = \frac{f_{correct}}{N}$$
其中$$f_{correct}$$表示预测结果正确的个数,N表示测试集的全部记录个数。
代码与数据
- 训练集train.csv: https://github.com/kdj842969/DataDescriptionBook/blob/master/IntegerSequence/train.csv
- 测试集test.csv: https://github.com/kdj842969/DataDescriptionBook/blob/master/IntegerSequence/test.csv
- 正确答案correct_submission.csv: https://github.com/kdj842969/DataDescriptionBook/blob/master/IntegerSequence/correct_submission.csv
- 提交格式样例sample_submission.csv: https://github.com/kdj842969/DataDescriptionBook/blob/master/IntegerSequence/sample_submission.csv
测评配置环境
python
pip install -U scikit-learn
pip install -U numpy
pip install -U pandas
测评代码
import pandas as pd
y_test = pd.read_csv(“./correct_submission.csv").sort_values('Id')
y_pred = pd.read_csv(“./prediction_test.csv").sort_values('Id')
count = (y_test.Last == y_pred.Last).value_counts() # 计算有多少相同的数字
accuracy = count.iloc[0] / y_test.shape[0]
# accuracy越大越好