Efenim, içinde bir çok proje barındıran "mir" bayağı almış yürümüş.
Linear cebir için "lubeck" isimli bir kütüphanemiz varmış. Ayrıca mir.random , mir.slice , mir.algorithm çok güzel olmuş. Pyhton'nun meşhur numpy 'sinin D versiyonu "numir" çıkmış.
Bunları kullanarak "mir" ' ci arkadaşlardan biri sınıflandırma için "decision tree" methodunu gerçekleştirmiş: "https://github.com/ShigekiKarita/d-tree".
Ben kendi alım satım projemde bu satın alma - almama konusunda D-tree 'nin çok basit-ilkel bir versiyonunu yapmış ve kullanıyordum. Başarılı olmadığı için biraz bakınmaya başladım.
Benim çalıştığım data binlerce örnekden oluşuyor fakat örnek iki satır :
0.993697 3.625995 0.626431 1.05396 1.00838 1.33333 0.146228 0.988685
1.014998 5.145 1.32265 1.56739 1.01539 5.66667 1.07868 0.709307
İlk sutun kar veya zararı içeriyor 0.993 , %0.7 zarar demek olurken, 1.014 %1.4 kar demek oluyor.
Diğerleri sutunlar ise kullandığım "parametreler". İşte son 30 saniye ne kadar alım oldu gibi. Örnekte 7 tane parametrem var ayrı ayrı.
Aşağıdaki kodda ilk 100 satırı test için ayırıyorum. İlk sutundaki değeri 1 den küçükse "0" veya büyükse "1" diye etiketliyorum.
Modeli "train" metodu ile eğitip "predict" methodu ile tahmin gerçekleştiriyorum.
Böyle şeyleri görmek beni sevindirdiği için paylaşmak istedim.
import std.stdio;
import std.algorithm;
import std.range;
import std.conv;
import std.string;
import mir.ndslice;
import dtree.tree;
import dtree.impurity;
auto readCSV(in string path) {
import std.csv;
import std.algorithm;
import std.array;
return File(path).byLine.map!( a => a.idup.split(",").map!( b => to!double(b) ) );
}
void main()
{
import mir.ndslice : map, slice, iota;
import mir.random : Random, unpredictableSeed;
import mir.random.variable : BernoulliVariable ;
import numir.random : normal;
import dtree.tree : ClassificationTree;
import dtree.forest : toRandomForest;
import dtree.impurity : gini, entropy;
auto allData = readCSV("data.csv").array();
double[] dataRaw;
int[] labelRaw;
auto dataAppender = appender(&dataRaw);
auto labelAppender = appender(&labelRaw);
auto numberOfFeatures = allData.front.length - 1;
void DataFormer(R)( R inData )
{
dataAppender.put(inData[1..$]);
labelAppender.put( inData[0] > 1.0 ? 1 : 0 );
}
std.algorithm.each!( a=> DataFormer(a) )( allData.dropExactly(100) ) ;
enum numberOfOutputs = 2;
auto dataMatrix = dataRaw.sliced( dataRaw.length/numberOfFeatures , numberOfFeatures );
auto labelVector = labelRaw.sliced( );
auto gtree = ClassificationTree!gini(numberOfOutputs);
gtree.fit(dataMatrix, labelVector);
writeln( "Train complete" );
auto testData = allData.take(100).array();
foreach ( testSample; testData )
{
int curLabel = testSample[0] > 1.0 ? 1 : 0;
auto predictResult = gtree.predict( testSample[1..$] );
writeln( " Actual: ", curLabel, " Predict: ", predictResult );
}
}
Erdemdem
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]