March 02, 2018

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. ]