extractProjection <- function(ndim,princ) {
return(princ$rotation[,1:ndim]) #Эта функция уже была определена ранее, но в этот раз нельзя менять знаки в матрицах как раньше
}
countOfComponentsToUse <- ncol(princ$x) # сюда можно в цикле подставлять числа от 2 до ncol(princ$x), увеличивая число компонент до необходимой точности
PCnameList <- colnames(princ$x)[1:countOfComponentsToUse]
proj <- extractProjection(countOfComponentsToUse, princ)
residualsMatrix <- dmTrain - ((princ$x[,1:countOfComponentsToUse]) %*% (t(proj)))
V0 <- sum(residualsMatrix*residualsMatrix)/nrow(dmTrain)
TRV <- V0/ncol(dmTrain) #полная дисперсия остатков (средний квадрат ошибок)
ERV <- 1-nrow(dmTrain)*V0/sum(dmTrain*dmTrain) #объяснённая дисперсия остатков, нужно увеличивать число компонент если ERV < 0.95
Всем привет! Меня зовут Алексей. Я Data Scientist в компании Align Technology. В этом материале я расскажу вам о подходах к feature selection, которые мы практикуем в ходе экспериментов по анализу данных. В нашей компании статистики и инженеры machine learning анализируют большие объемы клинической информации, связанные с лечением пациентов...
私の実験の現状。
コードの誤りを修正した後、私のデータでは、実際、私は、検証で次のような結果になっています。
このチャートには、通貨ペア、予測期間、そしていわゆるグレーゾーン(予測マシンの出力で、市場に参入する決定がなされない値の間隔)が列挙されています。
ご覧の通り、すでに多くのペアで手口がプラスになっています。EURUSDの場合は最大値。同時に、すべてのペアの実際のスプレッド(私のDCから)を使って、さらに精度の高い実験をしています。
spreads <- as.data.frame(cbind(
c('audusd'
, 'eurusd'
, 'gbpusd'
, 'usdcad'
, 'usdchf')
, c(0.00018
, 0.0001
, 0.00014
, 0.00013
, 0.00012)
)
)
今、さらに多くのパラメータをチェックする強力な一般化実験を始めていて、1週間ほど続く予定です。見積もりは約60倍となる。でもその時は、必ず良い結果を出して比較します。そして、どこかで約束したように、基本ロジックをテストできるようにしたExpert Advisor(トレーニング済み)を掲載します。さらに発展させることができます。MQLのコードに直接さまざまなエンハンサーを追加して、自分用に改良していくつもりです。
また近いうちにお話ししましょう。
なーんだ、確かに非定常性の重要性をよく理解してないね。NSモデルでも線形モデルでも私のモデルでもいいのですが、データが非定常であれば、その上で見出された依存関係はサンプル外では発生しないことが保証されます。生の価格、MA(生の価格)、バーオープニング(生の価格)などの形式で持っているすべてのデータは、モデルから削除する必要があります。最後に判明した価格からその差を取る必要があります。
ここでは、区間へのスケーリングはできません。
悪いことばかりではありません。各トレーニング例を別々に考えれば(つまり、トレーニングテーブルから1行で正規化すれば)、各トレーニング例で別々に、グループごとにすべてのデータを正規化することができます。例えば、1つの学習例における100本のバー(合計400本)のo,h,l,c列を取り出し、その最小値と最大値を求め、スキャンすることができます。これは、すべての学習例について個別に繰り返す必要があります。この正規化により、すべての行のトレーニングテーブルの価格が常に[0...1]の範囲となることが保証されます。もし将来、学習時の価格をはるかに超えた新しい例が出たとしても、正規化によって[0..1]の範囲に戻され、ニューラルネットワークにとって新しい未知のデータ領域にはならないでしょう。学習されたモデルは、「過去N本のバーのうち少なくとも1回は価格が0.8より高い」というようなルールを発見し認識することができ、価格が半分に下がったとしても、このルールは新しいデータに対して適用されます。
通常のように各列を別々に正規化すると、フロントテストのモデルの結果が悪くなる。1つの学習例における同型の予測子間の依存関係は失われる。(例えば、Open[1]、Open[2]、Open[3]...と同じ学習例から、すべての学習例に従って、異なる間隔でスキャンされます)。また、学習時の正規化は数千の学習例に基づいて行われますが、実際の取引では自分自身との波動でスケーリングすべきラインが1つしかないため、明確でなく違和感があるという問題があります。
正規化を全く行わなければ、それで済む話です。しかし、もし価格がトレーニングに利用できる区間を超えて下落/上昇した場合、それはモデルにとって新しい、全く未知のデータ領域となるのです。引き出せずにクラッシュしてしまいます。
全ては経験上、ニューラルネットワークに厳密なのです。
y-scaleのpcaでもう少し作業しました。分散式の良い記事を見つけたのでhttp://www.chemometrics.ru/materials/textbooks/pca.htm, Rで作ってみた。
同記事より基本コードhttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/
princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE) " というコードを実行して停止 する必要があります。
要は大雑把に言うと、princオブジェクトには法案行列(princ$x)と荷重行列(princ$rotation)が入っています。この二つの行列 princ$x %*% t(princ$rotation) を掛け合わせると、dmTrain のデータ(Y でスケーリング、ターゲット変数なし)の元のテーブルが返ってきます。
主成分の数を制限することも可能で、その場合はある程度の誤差を含みながら元データを決定することになる。もし、インターネットの速度が遅いことや、読み込むとシャープになる特殊なjpeg画像を覚えているならば、同じようなことを得ることができます。
成分数Nに対して、初期データは以下のように定義される: princ$x[,1:N] %*% t(princ$rotation[,1:N]).dmTrain から結果の行列を引くと、residualsMatrix が得られ、誤差が計算できます。これは、実データと発見されたデータがどれくらい違うかという誤差である。TRVは誤差の二乗の平均値です。ERVは平均誤差のようなものです。ERV=0.8の場合、表の各セルにおいて、ソースデータがファウンドデータと20%程度異なる。つまり、10という数字が見つかったら、元のデータは8から12である可能性が高いということです。 これは非常に大雑把な定義ですが、より理にかなっていると思います。また、PCAモデルが十分な成分を含んでいるためには、ERVは少なくとも0.95である必要があります。
そこから何を得るのか?princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE, tol=0.01) に新しいパラメータtolを追加すると、何千もの主成分を生成することなく、新しい成分のsdevが < sdev(PC1) * tolとなったときに生成を停止するようにすることができます。その後、上記の機能で使用部品点数を調整し、2点から徐々に1点ずつ増やしていくことが可能です。
予測因子の選別にどう適用するか考えてみたが、まだ何も思い浮かばない。例えば、princ$rotationの1つの予測変数のloadを0に置き換え、ERVを再計算し、結果がどの程度悪くなるかを見ることができます。しかし、私はこの行為に意味を見いだせません。この結果をどのように適用するのか、明確ではありません。そうすれば、新しい情報を持たない相関のある予測因子を見つけることができ、そのため、それらを排除しても、おそらく結果は悪化しないでしょう。ノイズ予測因子を見つけたいのですが、これらの行列にはターゲット変数との関連がなく、つまり何がノイズで何がノイズでないかの基準が全くありません。
y-scaleのpcaでもう少し作業しました。分散式の良い記事を見つけたのでhttp://www.chemometrics.ru/materials/textbooks/pca.htm, Rで作ってみた。
同記事より基本コードhttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/
と、例のごとく繰り返した。自分のデータに置き換えたところ、分散0.95で100以上の主成分が得られました。ロギングプロットを見ましたが、目立った良い予測因子は見当たりませんでした。例えば、著者は2つの主成分と5つの予測変数が残っていると見ていますが、私のデータでは100以上の成分と1000以上の予測変数が残っています(lowadingsは段階的に減少し、lowadings除去の閾値が何であるかも明らかではありません)。
しかし、Y-Aware PCAを評価すべきです。私は、事前スクリーニングなしで自分のデータを代用し、その上でY-Aware PCAモデルを構築し、フロントテストで45%の誤差を得ました。FXではまだ利益が出ていませんが、記事はそこで終わっているので、もし私がy-aware pcaを使うのであれば、何か別の方法を考えなければなりませんね。
その他に、12個の予測変数だけを残し、nnetを学習させ、フロントテストエラーを30%だけ得ることができます。y-aware pcaで同様の結果を得たい。と、例のごとく繰り返した。それを自分のデータに置き換えたところ、100以上の主成分が得られ、分散は0.95となりました。ロギングプロットを見ましたが、目立った良い予測因子は見当たりませんでした。例えば、著者が自分のデータで2つの主成分と5つの予測変数が残っているのを見ている一方で、私のデータでは100以上の成分と1000以上の予測変数(lowadingsは段階的に減少し、lowadingsのどの閾値を削除すべきかも明確ではありません)が残っています。
しかし、Y-Aware PCAを評価すべきです。私は、事前スクリーニングなしで自分のデータを代用し、その上でY-Aware PCAモデルを構築し、フロントテストで45%の誤差を得ました。FXの場合はまだ利益が出ていないのですが、記事はそこで終わっているので、もしy-aware pcaを使うなら他のものを考えなければなりません。
その他に、12個の予測変数だけを残し、nnetを学習させ、フロントテストエラーを30%だけ得ることができます。y-aware pcaで同様の結果を得たい。https://c.mql5.com/3/97/Principal_Components_Regression__1.zip
以下は記事にあるRコード、ファイル_03.txtと_04.txtです。私は以前、私のデータでこのすべてを実行しました。さらに_04.txtにフロントテストデータのチェックを追加しました。唯一の違いは、記事の最後に提供されるエタールパッケージですね。しかし、例もなく、ただvtreat pruneが行う結果と比較してみてくださいというものです。
https://c.mql5.com/3/97/Principal_Components_Regression__1.zip
以下は記事にあるRコード、ファイル_03.txtと_04.txtです。私は以前、私のデータでこのすべてを実行しました。さらに_04.txtにフロントテストデータのチェックを追加しました。唯一の違いは、記事の最後に提供されるエタールパッケージですね。しかし、例もなく、ただ試してみて、vtreat pruneが行う結果と比較してくださいということを申し出ています。
かなりしっかりしているように見えます。
では、役に立つ結果はないのか?
機能選択に関する私の記事。
https://habrahabr.ru/company/aligntechnology/blog/303750/
こんにちは。
アイデアはある、調べたい、でも実装するためのツールがわからない...。数ポイント先、例えば3ポイントや5ポイント先まで予測できるようなアルゴリズムが必要です(できればニューラルネットワークがいいです)。
私は分類の仕事しかしたことがないので、それがどのように見えるべきかを理解することも、誰かにそれを行う方法を助言することも、Rのパッケージを推奨することもできません。
p.s. Alexeyの素晴らしい記事