JavaRush /Java Blog /Random-TK /Java döredijiler üçin maşyn öwrenmek, 2-nji bölüm

Java döredijiler üçin maşyn öwrenmek, 2-nji bölüm

Toparda çap edildi
Java döredijiler üçin maşyn öwrenmek, 1-nji bölüm
Java döredijiler üçin maşyn öwrenmek, 2-nji bölüm

Obýektiw funksiýany bahalandyrmak

Maksatlaýyn funksiýa , çaklama funksiýasy diýlip hem bilinýär, taýýarlyk ýa-da okuw prosesiniň netijesidir. хMatematiki taýdan kynçylyk üýtgeýjini giriş hökmünde kabul edýän we çak edilýän bahany yzyna gaýtaryp berýän funksiýany tapmakdyr у.
Java döredijiler üçin maşyn öwrenmek, 2-nji bölüm
Maşyn öwrenmekde, (J(θ))berlen obýektiw funksiýanyň säwlik bahasyny ýa-da "bahasyny" hasaplamak üçin çykdajy funksiýasy ulanylýar.
Java döredijiler üçin maşyn öwrenmek, 2-nji bölüm
Çykdajy funksiýasy, modeliň okuw maglumatlaryna näderejede laýykdygyny görkezýär. Aboveokarda görkezilen obýektiw funksiýanyň bahasyny kesgitlemek üçin, her bir mysal öýüniň kwadrat ýalňyşyny hasaplamaly (i). Roralňyşlyk, hasaplanan baha bilen jaýyň уhakyky bahasynyň arasyndaky aralykdyr . yi
Java döredijiler üçin maşyn öwrenmek, 2-nji bölüm
Mysal üçin, meýdany 1330 = 6,500,000 € bolan jaýyň hakyky bahasy . Öwredilen obýektiw funksiýa boýunça çak edilýän jaý bahasynyň arasyndaky tapawut, 0 7,032,478 : tapawut (ýa-da ýalňyşlyk) 2 532,478 . Bu tapawudy ýokardaky grafada hem görüp bilersiňiz. Tapawut (ýa-da ýalňyşlyk) her bir baha ugrundaky okuw jübüti üçin dik çyzykly gyzyl çyzyklar hökmünde görkezilýär. Öwredilen obýektiw funksiýanyň bahasyny hasaplap, her öý üçin kwadrat ýalňyşlygy mysalda jemläp, esasy bahasyny hasaplamaly. Bahanyň bahasy näçe kiçi bolsa (J(θ)), obýektiw funksiýamyzyň çaklamalary şonça-da dogry bolar. 3-nji sanawda obýektiw funksiýa, okuw maglumatlarynyň sanawy we olar bilen baglanyşykly bellikler hökmünde çykdajy funksiýasynyň ýönekeý Java ýerine ýetirilişi görkezilýär. Çaklama bahalary aýlawda hasaplanar we ýalňyşlyk hakyky bahanyň bahasyny (bellikden alnan) aýyrmak bilen hasaplanar. Soň bolsa, ýalňyşlyklaryň kwadraty jemlener we säwlik bahasy hasaplanar. Bahasy görnüşiň bahasy hökmünde yzyna gaýtarylar double:

Sanaw-3

public static double cost(Function<ltDouble[], Double> targetFunction,
 List<ltDouble[]> dataset,
 List<ltDouble> labels) {
 int m = dataset.size();
 double sumSquaredErrors = 0;

 // рассчет квадрата ошибки («разницы») для каждого тренировочного примера и //добавление его к сумме
 for (int i = 0; i < m; i++) {
 // получаем вектор признаков из текущего примера
 Double[] featureVector = dataset.get(i);
 // предсказываем meaning и вычисляем ошибку базируясь на реальном
 //значении (метка)
 double predicted = targetFunction.apply(featureVector);
 double label = labels.get(i);
 double gap = predicted - label;
 sumSquaredErrors += Math.pow(gap, 2);
 }

 // Вычисляем и возращаем meaning ошибки (чем меньше тем лучше)
 return (1.0 / (2 * m)) * sumSquaredErrors;
}
Java hakda okamak isleýärsiňizmi? Java Developer toparyna goşulyň !

Maksat funksiýasyny öwrenmek

Çykdajy funksiýasy obýektiw funksiýanyň hiline we teta parametrlerine baha bermäge kömek etse-de, iň amatly teta parametrlerini tapmaly. Munuň üçin gradient desent algoritmini ulanyp bilersiňiz.

Gradient aşak

Gradient aşak düşmegi çykdajy funksiýasyny azaldýar. (J(θ))Bu, okuw maglumatlaryna esaslanyp iň az çykdajyly teta parametrlerini tapmak üçin ulanylýandygyny aňladýar . Ine, täze, has laýyk teta bahalaryny hasaplamak üçin ýönekeýleşdirilen algoritm:
Java döredijiler üçin maşyn öwrenmek, 2-nji bölüm
Şeýlelik bilen, teta wektorynyň parametrleri algoritmiň her gezek gaýtalanmagy bilen gowulaşar. Okuw koeffisiýenti each her gaýtalama boýunça hasaplamalaryň sanyny kesgitleýär. Bu hasaplamalar, "gowy" teta bahalary tapylýança amala aşyrylyp bilner. Mysal üçin, aşakdaky çyzykly regressiýa funksiýasynyň üç sany teta parametri bar:
Java döredijiler üçin maşyn öwrenmek, 2 - 6 bölüm
Her gezek gaýtalanylanda, teta parametrleriniň her biri üçin täze baha hasaplanar :, we . Her gezek gaýtalanylandan soň, täze teta vektory 0 , θ 1 , θ 2 using ulanyp , täze, has laýyk ýerine ýetiriş döredilip bilner . -4 sanawda, gradiýentiň çüýremek algoritmi üçin Java kody görkezilýär. Regressiýa funksiýasy üçin Teta okuw maglumatlary, marker maglumatlary, okuw tizligi bilen taýýarlanar . Netijede, teta parametrlerini ulanyp kämilleşdirilen obýektiw funksiýa bolar. Usul täze obýektiw funksiýany we öňki hasaplamalardan täze teta parametrlerini geçip, gaýta-gaýta çagyrylar. Bu çagyryşlar düzülen obýektiw funksiýa iň pes platosa ýetýänçä gaýtalanar: θ0θ1θ2LinearRegressionFunction(α)train()

Sanaw-4

public static LinearRegressionFunction train(LinearRegressionFunction targetFunction,
 List<ltDouble[]> dataset,
 List<ltDouble> labels,
 double alpha) {
 int m = dataset.size();
 double[] thetaVector = targetFunction.getThetas();
 double[] newThetaVector = new double[thetaVector.length];

 // вычисление нового значения тета для каждого element тета массива
 for (int j = 0; j < thetaVector.length; j++) {
 // сумируем разницу ошибки * признак
 double sumErrors = 0;
 for (int i = 0; i < m; i++) {
 Double[] featureVector = dataset.get(i);
 double error = targetFunction.apply(featureVector) - labels.get(i);
 sumErrors += error * featureVector[j];
 }

 //вычисляем новые значения тета
 double gradient = (1.0 / m) * sumErrors;
 newThetaVector[j] = thetaVector[j] - alpha * gradient;
 }

 return new LinearRegressionFunction(newThetaVector);
}
Çykdajylaryň yzygiderli azalmagyny üpjün etmek üçin, J(θ)her okuw ädiminden soň çykdajy funksiýasyny işledip bilersiňiz. Her gezek gaýtalanylandan soň çykdajy peselmeli. Bu bolmasa, okuw koeffisiýentiniň bahasynyň gaty uludygyny we algoritmiň iň pes bahany ýitirendigini aňladýar. Şeýle ýagdaýda gradientiň çüýremek algoritmi şowsuz bolýar. Aşakdaky ýerler, başlangyç teta wektoryndan başlap, täze hasaplanan teta parametrlerini ulanyp, obýektiw funksiýany görkezýär {1.0, 1.0}. Çep sütün, 50 gezek gaýtalanylandan soň çaklama funksiýasynyň sýu plotetini görkezýär; 200 gezek gaýtalanandan soň orta sütün; we 1000 gezek gaýtalanandan soň sag sütün. Bulardan her gezek gaýtalanylandan soň bahanyň peselýändigini we täze obýektiw funksiýanyň has gowy we has laýyk gelýändigini görüp bileris. 500-600 gezek gaýtalanandan soň, teta parametrleri düýpgöter üýtgemez we bahasy durnuk platosa ýeter. Ondan soň, maksat funksiýasynyň takyklygyny bu görnüşde gowulaşdyryp bolmaz.
Java döredijiler üçin maşyn öwrenmek, 2 - 7 bölüm
Bu ýagdaýda, çykdajy 500-600 gezek gaýtalanylandan soň ep-esli azalmasa-da, obýektiw funksiýa entek optimal däl. Bu gapma-garşylygy görkezýär . Maşyn öwrenmekde, "ylalaşyksyzlyk" termini, okuw algoritminiň maglumatlaryň esasy ugurlaryny tapmaýandygyny görkezmek üçin ulanylýar. Hakyky durmuş tejribesine esaslanyp, has uly häsiýetler üçin inedördül metr üçin bahanyň arzanlamagyna garaşylýar. Mundan maksatly funksiýany öwrenmek prosesi üçin ulanylýan modeliň maglumatlara ýeterlik derejede laýyk gelmeýändigi barada netije çykaryp bileris. Tapawut köplenç modeliň aşa köpelmegi bilen baglanyşyklydyr. Bu biziň ýagdaýymyzda bolup geçdi, obýektiw funksiýa gaty ýönekeý we derňew üçin ýekeje parametr - jaýyň meýdany ulanylýar. Emma bu maglumatlar jaýyň bahasyny takyk çaklamak üçin ýeterlik däl.

Aýratynlyklary goşmak we ulaltmak

Obýektiw funksiýaňyzyň çözjek bolýan meseläňize laýyk gelmeýändigini görseňiz, düzedilmeli. Gabat gelmeýänligi düzetmegiň umumy usuly, aýratynlyk wektoryna goşmaça aýratynlyklar goşmakdyr. Jaýyň bahasynyň mysalynda otaglaryň sany ýa-da jaýyň ýaşy ýaly aýratynlyklary goşup bilersiňiz. Houseagny, {size}jaýy suratlandyrmak üçin bir aýratynlyk bahasy bolan wektory ulanmagyň ýerine birnäçe bahaly wektor ulanyp bilersiňiz, mysal üçin, {size, number-of-rooms, age}. Käbir ýagdaýlarda, bar bolan okuw maglumatlarynda aýratynlyklaryň sany ýeterlik däl. Soňra bar bolanlary ulanyp hasaplanýan köp aýally aýratynlyklary ulanmaga synanyşmaly. Mysal üçin, jaýyň bahasyny kesgitlemek üçin kwadrat metrleriň (x2) hasaplanan aýratynlygyny öz içine alýan obýektiw funksiýany giňeltmäge mümkinçiligiňiz bar:
Java döredijiler üçin maşyn öwrenmek, 2 - 8 bölüm
Birnäçe aýratynlygy ulanmak , dürli aýratynlyklar boýunça diapazony standartlaşdyrmak üçin ulanylýan aýratynlyk ulalmagyny talap edýär. Şeýlelik bilen, 2 ululykdaky atribut üçin bahalaryň diapazony, ululyk atributy üçin bahalaryň diapazonyndan ep-esli uludyr. Aýratynlyklary ulaltmazdan, 2 ululyk çykdajy funksiýasyna bikanun täsir eder. 2 ululyk atributy bilen girizilen säwlik, ululyk atributynyň girizen säwliginden ep-esli uly bolar. Aşakda ýönekeý aýratynlyk ölçeg algoritmi berilýär:
Java döredijiler üçin maşyn öwrenmek, 2 - 9 bölüm
FeaturesScalingBu algoritm aşakdaky mysal kodunda synpda ýerine ýetirilýär . Bu synp FeaturesScalingokuw maglumatlaryna laýyk gelýän ulaltmak funksiýasyny döretmek üçin täjirçilik usulyny hödürleýär. Içerki, ortaça, iň pes we iň ýokary bahalary hasaplamak üçin okuw maglumatlary mysallary ulanylýar. Alnan funksiýa aýratynlyk wektoryny alýar we ulaldylan aýratynlyklary bilen täzesini öndürýär. Aýratynlyklary ulaltmak, aşakda görkezilişi ýaly, okuw prosesi we çaklama prosesi üçin zerurdyr:
// создание массива данных
List<ltDouble[]> dataset = new ArrayList<>();
dataset.add(new Double[] { 1.0, 90.0, 8100.0 }); // feature vector of house#1
dataset.add(new Double[] { 1.0, 101.0, 10201.0 }); // feature vector of house#2
dataset.add(new Double[] { 1.0, 103.0, 10609.0 }); // ...
//...

// создание меток
List<ltDouble> labels = new ArrayList<>();
labels.add(249.0); // price label of house#1
labels.add(338.0); // price label of house#2
labels.add(304.0); // ...
//...

// создание расширенного списка признаков
Function<ltDouble[], Double[]> scalingFunc = FeaturesScaling.createFunction(dataset);
List<ltDouble[]> scaledDataset = dataset.stream().map(scalingFunc).collect(Collectors.toList());

// создаем функцию которая инициализирует теты и осуществляет обучение //используя коэффициент обучения 0.1

LinearRegressionFunction targetFunction = new LinearRegressionFunction(new double[] { 1.0, 1.0, 1.0 });
for (int i = 0; i < 10000; i++) {
 targetFunction = Learner.train(targetFunction, scaledDataset, labels, 0.1);
}

// делаем предсказание стоимости дома с площадью 600 m2
Double[] scaledFeatureVector = scalingFunc.apply(new Double[] { 1.0, 600.0, 360000.0 });
double predictedPrice = targetFunction.apply(scaledFeatureVector);
Has köp aýratynlyk goşuldygyça, obýektiw funksiýa laýyklyk artýar, ýöne seresap boluň. Örän aşa gidip, köp aýratynlyklary goşsaňyz, artykmaç obýektiw funksiýany öwrenip bilersiňiz.

Artykmaç gabat gelmek we kesişme

Artykmaçlyk obýektiw funksiýa ýa-da model okuw maglumatlaryna gaty laýyk gelende ýüze çykýar, şeýle hem okuw maglumatlarynda ses ýa-da tötänleýin üýtgeşiklikleri alýar. Artykmaç geýmegiň mysaly aşakdaky iň sag grafikde görkezilýär:
Java döredijiler üçin maşyn öwrenmek, 2-10-njy bölüm
Şeýle-de bolsa, artykmaç model okuw maglumatlarynda gaty gowy ýerine ýetirýär, ýöne hakyky näbelli maglumatlarda erbet işleýär. Artykmaçlykdan gaça durmagyň birnäçe usuly bar.
  • Okuw üçin has uly maglumat toplumyny ulanyň.
  • Aboveokardaky grafiklerde görkezilişi ýaly az aýratynlyklary ulanyň.
  • Düzgünleşdirmegi göz öňünde tutýan kämilleşdirilen maşyn öwreniş algoritmini ulanyň.
Eger çaklama algoritmi okuw maglumatlaryndan has ýokary bolsa, onuň takyklygyna peýdasy degmeýän aýratynlyklary ýok etmeli. Kynçylyk, çaklamanyň takyklygyna beýlekilerden has möhüm täsir edýän aýratynlyklary tapmakdyr. Grafalarda görkezilişi ýaly, artykmaç geýim grafikleri ulanyp wizual kesgitläp bolýar. Bu 2 ýa-da 3 koordinatly grafikler üçin gowy işleýär, 2-den gowrak aýratynlyk ulansaňyz, grafigi meýilleşdirmek we baha bermek kyn bolýar. Çekişme barlagynda, okuw gutarandan soň algoritmine näbelli maglumatlary ulanyp, okuwdan soň modelleri saklaýarsyňyz. Elýeterli bellikli maglumatlary 3 topluma bölmek gerek:
  • okuw maglumatlary;
  • barlamak maglumatlary;
  • synag maglumatlary.
Bu ýagdaýda, jaýlary häsiýetlendirýän bellikli ýazgylaryň 60 göterimi maksat algoritminiň okuw wariantlaryny ulanmakda ulanylmaly. Okuwdan soň, galan maglumatlaryň ýarysy (öň ulanylmady) tälim berlen maksat algoritminiň näbelli maglumatlarda gowy işleýändigini barlamak üçin ulanylmaly. Adatça, beýlekilerden has gowy ýerine ýetirýän algoritm ulanmak üçin saýlanýar. Galan maglumatlar soňky saýlanan model üçin säwlik bahasyny hasaplamak üçin ulanylýar. “K-fold” ýaly beýleki kesiş barlag usullary bar . Şeýle-de bolsa, men olary bu makalada suratlandyrjak däl.

Maşyn öwrenmek gurallary we Weka çarçuwasy

Çarçuwalaryň we kitaphanalaryň köpüsi maşyn öwrenmek algoritmleriniň giň toplumyny üpjün edýär. Mundan başga-da, maglumat modellerini taýýarlamak, synagdan geçirmek we gaýtadan işlemek üçin amatly ýokary derejeli interfeýs berýär. Weka JVM üçin iň meşhur çarçuwalardan biridir. Weka, modelleri barlamak üçin grafiki synaglary öz içine alýan amaly Java kitaphanasydyr. Aşakdaky mysal, aýratynlyklary we bellikleri öz içine alýan okuw maglumatlar binýadyny döretmek üçin Weka kitaphanasyny ulanýar. Usul setClassIndex()- bellemek üçin. Wekada bir bellik synp hökmünde kesgitlenýär:
// определяем атрибуты для признаков и меток
ArrayList<ltAttribute> attributes = new ArrayList<>();
Attribute sizeAttribute = new Attribute("sizeFeature");
attributes.add(sizeAttribute);
Attribute squaredSizeAttribute = new Attribute("squaredSizeFeature");
attributes.add(squaredSizeAttribute);
Attribute priceAttribute = new Attribute("priceLabel");
attributes.add(priceAttribute);


// создаем и заполняем список признаков 5000 примеров
Instances trainingDataset = new Instances("trainData", attributes, 5000);
trainingDataset.setClassIndex(trainingSet.numAttributes() - 1);
Instance instance = new DenseInstance(3);

instance.setValue(sizeAttribute, 90.0);
instance.setValue(squaredSizeAttribute, Math.pow(90.0, 2));
instance.setValue(priceAttribute, 249.0);
trainingDataset.add(instance);
Instance instance = new DenseInstance(3);
instance.setValue(sizeAttribute, 101.0);
...
Maglumat toplumy we nusga obýekti faýldan saklanyp we ýüklenip bilner. Weka, Wekanyň grafiki görkezijileri bilen goldanýan ARFF (Attribute Relation File Format) ulanýar. Bu maglumat toplumy Wekada klassifikator hökmünde tanalýan obýektiw funksiýany öwretmek üçin ulanylýar. Ilki bilen obýektiw funksiýany kesgitlemeli. Aşakdaky kod LinearRegressionklassifikatoryň mysalyny döreder. Bu klassifikator ulanyp ulanylar buildClassifier(). Usul buildClassifier()iň oňat maksat modelini gözlemek üçin okuw maglumatlaryna esaslanýan teta parametrlerini saýlaýar. Weka bilen, okuw derejesini ýa-da gaýtalanma sanyny kesgitlemek barada alada etmeli däl. Weka aýratynlyk ulalmagyny özbaşdak ýerine ýetirýär.
Classifier targetFunction = new LinearRegression();
targetFunction.buildClassifier(trainingDataset);
Bu sazlamalar ýerine ýetirilenden soň, obýektiw funksiýa aşakda görkezilişi ýaly jaýyň bahasyny çaklamak üçin ulanylyp bilner:
Instances unlabeledInstances = new Instances("predictionset", attributes, 1);
unlabeledInstances.setClassIndex(trainingSet.numAttributes() - 1);
Instance unlabeled = new DenseInstance(3);
unlabeled.setValue(sizeAttribute, 1330.0);
unlabeled.setValue(squaredSizeAttribute, Math.pow(1330.0, 2));
unlabeledInstances.add(unlabeled);

double prediction = targetFunction.classifyInstance(unlabeledInstances.get(0));
EvaluationWeka tälim berlen klassifikatory ýa-da modeli synamak üçin synp berýär . Aşakdaky kodda, ýalňyş netijelerden gaça durmak üçin saýlanan tassyklama maglumatlary ulanylýar. Ölçeg netijeleri (ýalňyşyň bahasy) konsolda görkeziler. Adatça, baha beriş netijeleri dürli maşyn öwrenmek algoritmlerini ýa-da bularyň üýtgemelerini ulanyp tälim alan modelleri deňeşdirmek üçin ulanylýar:
Evaluation evaluation = new Evaluation(trainingDataset);
evaluation.evaluateModel(targetFunction, validationDataset);
System.out.println(evaluation.toSummaryString("Results", false));
Aboveokardaky mysal, giriş bahalaryna esaslanyp, jaýyň bahasy ýaly san bahalaryny çaklaýan çyzykly regressiýany ulanýar. Çyzykly regressiýa yzygiderli san bahalaryny çaklamagy goldaýar. Ikilik bahalary çaklamak üçin (“Hawa” we “” ok ”), beýleki maşyn öwreniş algoritmlerini ulanmaly. Mysal üçin, karar agajy, nerw ulgamlary ýa-da logistik regressiýa.
// использование логистической регрессии
Classifier targetFunction = new Logistic();
targetFunction.buildClassifier(trainingSet);
Bu algoritmlerden birini ulanyp bilersiňiz, mysal üçin, e-poçta habarynyň spamdygyny ýa-da howany çaklamak ýa-da jaýyň gowy satyljakdygyny çaklamak üçin ulanyp bilersiňiz. Algoritmiňizi howany ýa-da jaýyň çalt satyljakdygyny çaklamagy öwretmek isleseňiz, başga maglumatlar toplumy gerek, meselem.topseller:
// использование атрибута маркера topseller instead of атрибута маркера цена
ArrayList<string> classVal = new ArrayList<>();
classVal.add("true");
classVal.add("false");

Attribute topsellerAttribute = new Attribute("topsellerLabel", classVal);
attributes.add(topsellerAttribute);
Bu maglumat toplumy täze klassifikator taýýarlamak üçin ulanylar topseller. Öwredilenden soň, çaklama jaňy, çak edilýän bahany almak üçin ulanyp boljak bellik synp indeksini yzyna gaýtarmaly.
int idx = (int) targetFunction.classifyInstance(unlabeledInstances.get(0));
String prediction = classVal.get(idx);

Netije

Maşyn öwrenmek statistika bilen ýakyndan baglanyşykly bolsa we köp matematiki düşünjeleri ulanýan bolsa-da, maşyn öwrenmek gurallary, matematikany çuňňur bilmezden, maşyn öwrenmegi programmalaryňyza goşup başlamaga mümkinçilik berýär. Şeýle-de bolsa, bu makalada öwrenen çyzykly regressiýa algoritmi ýaly esasy maşyn öwreniş algoritmlerine näçe gowy düşünseňiz, şonça-da dogry algoritmi saýlap, optimal öndürijilik üçin sazlap bilersiňiz. Iňlis dilinden terjime . Awtory: Gregor Rot, Programma arhitektory, JavaWorld.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION