0

仕事中のサイド プロジェクト用に、過去のローン、その収益率、およびそれらを借りた人々に関するデータを含む比較的小さな .CSV ファイル (最大 150,000 行) があります。ローンを組んでいる人のどの特性が最高の収益率と相関しているかを調べる必要があります。各行には、個人のクレジット スコア、月収、ローン期間などの数値データと、ローンが必要な目的などの質的データが含まれています。各エントリには合計 23 のフィールドがあり、フィールドごとに最大 2 ~ 10 の値が可能です。

私が最初に考えたのは、.CSV を SQLite にドロップしてから、各フィールドのすべての可能な順列をクエリし、結果から最高の収益率を選択することでした。ただし、クエリあたり .2 ミリ秒でも、計算を完了するのに約 400 年かかることに気付きました。これは明らかに機能しません。私が考えたもう 1 つの解決策は、たとえば、過去のローンの中で最も収益性の高い 10% を選択し、それらが最も頻繁に共有する特徴を見つけることでした。しかし、これは「たまたま」完済した非常にリスクの高いローンの特性を返すだけであり、新しいローンの引き受けを検討する際に選択するのに最も効果的な特性であるとは限りません。

私が考えることができる最も合理的な解決策は、値の範囲 (収入など) を持つことができるフィールドを取得し、バイナリ検索のようなものを実行することです。たとえば、収入を上位 50% と下位 50% に分割し、 ROR が最も高いグループの半分に、ROR が最も高いグループが含まれているとは限りません。最高のROR、およびb)この再帰的なチェックは、他の値の順列ごとにやり直す必要があり、それでも非常に高価になります.

このような問題はかなり一般的であり、標準的な解決策が存在すると思いますが、どこから探し始めればよいかわかりません。この問題にはどのような解決策が適切ですか? それについてもっと読むにはどこに行けばよいですか?

私の好みは Python でのソリューションですが、その仕事により適した別のツールがあれば、それも受け入れます。これがトピックから外れている場合は申し訳ありませんが、他にどこに質問すればよいかわかりません.1週間半回答なしで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 に答える