0

对于工作中的一个副项目,我有一个相对较小的 .CSV 文件(约 150k 行),其中包含有关历史贷款、它们的回报率以及将它们取出的人的数据。我需要找出贷款人的哪些属性与最高回报率相关。每行包含个人信用评分、月收入和贷款期限等数字数据,以及他或她需要贷款的目的等定性数据。每个条目总共有 23 个字段,每个字段有大约 2-10 个可能的值。

我最初的想法是将 .CSV 放到 SQLite 中,然后查询每个字段的所有可能排列,并从结果中挑选出最高的回报率。然而,即使是 0.2 毫秒/查询,我意识到完成计算需要大约 400 年的时间,这显然是行不通的。我考虑的另一个解决方案是选择,比如说,历史上最有利可图的 10% 的贷款,并找出它们最常共有的特征。但是,我怀疑这只会返回“发生”还清的高风险贷款的特征——不一定是考虑承销新贷款时选择的最有效特征。

我能想到的最合理的解决方案是获取可以具有一系列值(如收入)的字段并执行类似于二分搜索的操作,例如将收入分成前 50% 和后 50%,选择带有ROR 越高,然后将其分为顶部和底部 50%,等等。我认为这不会起作用,因为 a) 具有最高 ROR 的收入组不一定包含在具有最高 ROR 的组的一半中最高的 ROR,并且 b) 对于其他值的每个排列,都必须重做这种递归检查,仍然非常昂贵。

我想像这样的问题很常见并且存在标准解决方案,但我不知道从哪里开始寻找一个。什么样的解决方案适合这个问题?我可以去哪里阅读更多关于它的信息?

我更喜欢 Python 中的解决方案,但如果有另一种工具更适合我的工作,我愿意接受。如果这是题外话,我深表歉意,但我真的不知道在哪里可以问它——我把它放在 CrossValidated 上一个半星期没有答案,然后删除它并在此处重新发布。

4

2 回答 2

3

我建议聘请训练有素的统计学家,因为这类任务没什么特别的。您可以使用的技术和工具有很多,我的清单绝对不完整:

工具:

技巧:

  • 线性回归
  • 逻辑回归(通过使用任意拆分将回报率编码为 0/1)
  • 决策树
  • 神经网络
  • 聚类
  • ...

如果你想成功,你真的必须读一些书。或者发布匿名数据集,也许有人会帮助你更多。

如果您真的想自己继续,只需尝试 Weka 或Rattle (R),两者都有易于理解的 GUI,您可以在几分钟内创建您的第一个模型。

拨浪鼓截图:

在此处输入图像描述

于 2013-09-12T13:34:37.477 回答
2

您可以对数值进行最小二乘拟合。将所有数值输入列放入一个矩阵(A,150K×23)中,每一行作为矩阵中的一行。将输出值放入一个向量(b,150k 长)中,其顺序与矩阵中相应行的顺序相同。计算:

A' = A T A — 这将产生一个 23×23 的矩阵。
B' = A T b — 这将产生一个 23 长的向量。
X = (A') -1 B' - 结果将是一个 23 长的系数向量。

结果向量 (X) 将包含每个输入变量的大小。

A' 和 B' 矩阵可以迭代计算:

A' 0 = 0
A' n+1 = A' n + x T x
B' 0 = 0
B' n+1 = B' n + x T y

其中 x 是单个输入行,y 是相应的输出值。

这是 C# 中的一个示例:

CsvReader data = new CsvReader("myfile.csv");

int[] inputColumns = new int[] { 1, 2, 3, 6, 7, 9 }; // The numerical input-columns
int outputColumn = 0;
int size = inputColumns.Length;

var A = new Matrix(size, size);
var b = new Vector(size);

foreach (var row in data)
{
    var inputs = new double[size];
    for (int i = 0; i < size; i++)
    {
        inputs[i] = double.Parse(row[inputColumns[i]]);
    }

    var output = double.Parse(row[outputColumn]);

    for (int i = 0; i < size; i++)
    for (int j = 0; j < size; j++)
    {
        A[i,j] += inputs[i] * inputs[j];
    }

    for (int i = 0; i < size; i++)
    {
        b[i] += inputs[i] * output;
    }
}

return (A.Inverse * b).ToList();

CsvReaderMatrix并且Vector不是标准类,因此您必须找到一些包含这些的库。

于 2013-09-12T07:41:05.463 回答