JavaRush /Blog Jawa /Random-JV /Machine Learning kanggo Java Developers, Part 2

Machine Learning kanggo Java Developers, Part 2

Diterbitake ing grup
Machine Learning kanggo Pangembang Jawa, Part 1
Machine Learning kanggo Java Developers, Part 2 - 1

Estimasi Fungsi Objektif

Elinga yen fungsi target , uga dikenal minangka fungsi prediksi, minangka asil saka proses persiapan utawa latihan. Sacara matematis, tantangan kanggo nemokake fungsi sing njupuk variabel minangka input хlan ngasilake nilai sing diprediksi у.
Machine Learning kanggo Java Developers, Part 2 - 2
Ing machine learning, fungsi biaya (J(θ))digunakake kanggo ngetung nilai kesalahan utawa "biaya" saka fungsi obyektif tartamtu.
Machine Learning kanggo Java Developers, Part 2 - 3
Fungsi biaya nuduhake carane model cocok karo data latihan. Kanggo nemtokake biaya fungsi objektif sing dituduhake ing ndhuwur, perlu kanggo ngetung kesalahan kuadrat saben omah conto (i). Kesalahan yaiku jarak antarane nilai sing diwilang уlan nilai nyata yomah saka conto i.
Machine Learning kanggo Java Developers, Part 2 - 4
Contone, rega nyata omah kanthi area 1330 = 6.500.000 € . Lan prabédan antarane rega omah sing diprediksi kanthi fungsi objektif sing dilatih yaiku € 7.032.478 : bedane (utawa kesalahan) yaiku € 532.478 . Sampeyan uga bisa ndeleng prabédan iki ing grafik ing ndhuwur. Bentenipun (utawa kesalahan) ditampilake minangka garis abang putus-putus vertikal kanggo saben pasangan latihan rega-area. Sawise ngitung biaya fungsi objektif sing dilatih, sampeyan kudu ngetung kesalahan kuadrat kanggo saben omah ing conto lan ngitung nilai utama. Sing luwih cilik regane regane (J(θ)), prediksi sing luwih akurat babagan fungsi objektif kita bakal luwih akurat. Listing 3 nuduhake implementasine Java prasaja saka fungsi biaya sing njupuk minangka input fungsi obyektif, dhaftar data latihan, lan label gadhah. Nilai prediksi bakal diwilang ing daur ulang lan kesalahan bakal diwilang kanthi nyuda rega rega nyata (dijupuk saka label). Mengko, kothak kesalahan bakal dijumlah lan nilai kesalahan bakal diwilang. Biaya bakal bali minangka nilai saka jinis double:

Dhaptar-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;
}
Kepengin maca babagan basa Jawa? Gabung karo grup Java Developer !

Sinau fungsi target

Sanajan fungsi biaya mbantu ngevaluasi kualitas fungsi objektif lan paramèter theta, sampeyan isih kudu nemokake paramèter theta sing paling cocog. Sampeyan bisa nggunakake algoritma keturunan gradien kanggo iki.

Keturunan Gradien

Penurunan gradien nyuda fungsi biaya. Iki tegese digunakake kanggo nemokake paramèter theta sing nduweni biaya minimal (J(θ))adhedhasar data latihan. Mangkene algoritma sing disederhanakake kanggo ngitung nilai theta anyar sing luwih cocog:
Machine Learning kanggo Java Developers, Part 2 - 5
Dadi, paramèter vektor theta bakal nambah kanthi saben pengulangan algoritma. Koefisien pembelajaran α nemtokake jumlah petungan ing saben iterasi. Petungan kasebut bisa ditindakake nganti nilai theta "apik" ditemokake. Contone, fungsi regresi linier ing ngisor iki nduweni telung parameter theta:
Machine Learning kanggo Java Developers, Part 2 - 6
Ing saben pengulangan, nilai anyar bakal diwilang kanggo saben paramèter theta: , , lan . Sawise saben pengulangan, implementasi anyar sing luwih cocok bisa digawe nggunakake vektor theta anyar 0 , θ 1 , θ 2 } . Listing -4 nuduhake kode Java kanggo algoritma bosok gradien. Theta kanggo fungsi regresi bakal dilatih nggunakake data latihan, data panandha, tingkat sinau . Asil bakal dadi fungsi objektif sing luwih apik nggunakake paramèter theta. Cara kasebut bakal diarani maneh lan maneh, ngliwati fungsi objektif anyar lan paramèter theta anyar saka petungan sadurunge. Lan telpon kasebut bakal diulang nganti fungsi objektif sing dikonfigurasi tekan dataran minimal: θ0θ1θ2LinearRegressionFunction(α)train()

Dhaptar-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);
}
Kanggo mesthekake yen biaya terus suda, sampeyan bisa mbukak fungsi biaya J(θ)sawise saben langkah latihan. Sawise saben pengulangan, biaya kudu ngurangi. Yen iki ora kedadeyan, tegese nilai koefisien sinau gedhe banget lan algoritma mung ora kejawab nilai minimal. Ing kasus kaya mengkono, algoritma bosok gradien gagal. Plot ing ngisor iki nuduhake fungsi objektif nggunakake paramèter theta anyar sing diwilang, diwiwiti karo vektor theta wiwitan {1.0, 1.0}. Kolom kiwa nuduhake plot fungsi prediksi sawise 50 iterasi; kolom tengah sawise 200 repetitions; lan kolom tengen sawise 1000 repetitions. Saka iki kita bisa ndeleng sing rega sudo sawise saben pengulangan, lan fungsi obyektif anyar pas luwih apik lan luwih apik. Sawise 500-600 repetisi, paramèter theta ora owah maneh kanthi signifikan, lan regane tekan dataran tinggi sing stabil. Sawise iki, akurasi fungsi target ora bisa ditingkatake kanthi cara iki.
Machine Learning kanggo Java Developers, Part 2 - 7
Ing kasus iki, sanajan biaya ora suda banget sawise 500-600 iterasi, fungsi objektif isih ora optimal. Iki nuduhake bedo . Ing machine learning, istilah "inconsistency" digunakake kanggo tegese algoritma learning ora nemokake tren dhasar ing data. Adhedhasar pengalaman nyata, bisa uga bakal nyuda rega saben meter persegi kanggo properti sing luwih gedhe. Saking menika saged dipunpendhet dudutan bilih model ingkang dipunginakaken kangge proses pamulangan fungsi target boten trep kaliyan data kanthi sae. Bedane asring amarga oversimplification model. Iki kedadeyan ing kasus kita, fungsi objektif banget prasaja, lan kanggo analisis nggunakake parameter siji - area omah. Nanging informasi iki ora cukup kanggo prédhiksi kanthi akurat rega omah.

Nambahake fitur lan skala

Yen sampeyan nemokake yen fungsi objektif sampeyan ora cocog karo masalah sing sampeyan nyoba kanggo ngatasi, iku perlu kanggo nyetel. Cara umum kanggo mbenerake inkonsistensi yaiku nambahake fitur tambahan menyang vektor fitur. Ing conto rega omah, sampeyan bisa nambah ciri kayata jumlah kamar utawa umur omah. Sing, tinimbang nggunakake vektor karo siji fitur Nilai {size}kanggo njlèntrèhaké omah, sampeyan bisa nggunakake vektor karo sawetara nilai, contone, {size, number-of-rooms, age}. Ing sawetara kasus, nomer fitur ing data training kasedhiya ora cukup. Banjur kudu nyoba nggunakake fitur polinomial sing diwilang nggunakake sing wis ana. Contone, sampeyan duwe kesempatan kanggo nggedhekake fungsi objektif kanggo nemtokake rega omah supaya kalebu fitur sing diitung saka meter persegi (x2):
Machine Learning kanggo Java Developers, Part 2 - 8
Nggunakake macem-macem fitur mbutuhake skala fitur , sing digunakake kanggo nggawe standar ing macem-macem fitur. Mangkono, sawetara nilai kanggo atribut ukuran 2 luwih gedhe tinimbang kisaran nilai kanggo atribut ukuran. Tanpa skala fitur, ukuran 2 bakal mengaruhi fungsi biaya. Kesalahan sing ditepungake dening atribut ukuran 2 bakal luwih gedhe tinimbang kesalahan sing diwenehake dening atribut ukuran. Algoritma skala fitur sing prasaja diwenehi ing ngisor iki:
Machine Learning kanggo Pangembang Jawa, Part 2 - 9
Algoritma iki dileksanakake ing kelas FeaturesScalinging conto kode ing ngisor iki. Kelas kasebut FeaturesScalingnyedhiyakake cara komersial kanggo nggawe fungsi skala sing disetel kanggo data latihan. Secara internal, conto data latihan digunakake kanggo ngetung nilai rata-rata, minimal lan maksimal. Fungsi sing diasilake njupuk vektor fitur lan ngasilake sing anyar kanthi fitur skala. Skala fitur perlu kanggo proses sinau lan proses prediksi, kaya sing ditampilake ing ngisor iki:
// создание массива данных
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);
Minangka liyane lan liyane fitur sing ditambahake, pas kanggo fungsi obyektif mundhak, nanging ati-ati. Yen sampeyan adoh banget lan nambah akeh banget fitur, sampeyan bisa uga sinau fungsi objektif sing overfit.

Over-matching lan cross-validasi

Overfitting occurs nalika fungsi obyektif utawa model pas banget karo data latihan, supaya bisa njupuk gangguan utawa variasi acak ing data latihan. Conto overfitting ditampilake ing grafik paling tengen ing ngisor iki:
Machine Learning kanggo Java Developers, Part 2 - 10
Nanging, model overfitting performs banget ing data latihan, nanging bakal nindakake kurang ing data nyata dingerteni. Ana sawetara cara kanggo nyegah overfitting.
  • Gunakake set data sing luwih gedhe kanggo latihan.
  • Gunakake fitur sing luwih sithik kaya sing dituduhake ing grafik ing ndhuwur.
  • Gunakake algoritma machine learning sing luwih apik sing njupuk regularisasi.
Yen algoritma prediksi ngluwihi data latihan, perlu kanggo ngilangi fitur sing ora nguntungake akurasi. Kangelan iku kanggo nemokake fitur sing duwe efek luwih pinunjul ing akurasi prediksi saka liyane. Kaya sing dituduhake ing grafik, overfit bisa ditemtokake kanthi visual nggunakake grafik. Iki bisa digunakake kanthi apik kanggo grafik kanthi koordinat 2 utawa 3, dadi angel kanggo ngrancang lan ngevaluasi grafik yen sampeyan nggunakake luwih saka 2 fitur. Ing validasi silang, sampeyan nyoba maneh model sawise latihan nggunakake data sing ora dingerteni algoritma sawise proses latihan rampung. Data label sing kasedhiya kudu dipérang dadi 3 set:
  • data latihan;
  • data verifikasi;
  • data tes.
Ing kasus iki, 60 persen saka cathetan label sing menehi ciri omah kudu digunakake ing proses varian latihan algoritma target. Sawise proses latihan, setengah saka data sing isih ana (ora digunakake sadurunge) kudu digunakake kanggo verifikasi yen algoritma target sing dilatih nindakake kanthi apik ing data sing ora dingerteni. Biasane, algoritma sing nindakake luwih apik tinimbang liyane dipilih kanggo digunakake. Data sing isih digunakake kanggo ngetung nilai kesalahan kanggo model sing dipilih pungkasan. Ana teknik validasi silang liyane, kayata k-fold . Nanging, aku ora bakal njlèntrèhaké ing artikel iki.

Piranti sinau mesin lan kerangka Weka

Umume kerangka lan perpustakaan nyedhiyakake koleksi algoritma machine learning sing akeh. Kajaba iku, nyedhiyakake antarmuka tingkat dhuwur sing trep kanggo latihan, nguji lan ngolah model data. Weka minangka salah sawijining kerangka kerja sing paling populer kanggo JVM. Weka minangka perpustakaan Jawa praktis sing ngemot tes grafis kanggo validasi model. Conto ing ngisor iki nggunakake perpustakaan Weka kanggo nggawe set data latihan sing ngemot fitur lan label. Cara setClassIndex()- kanggo menehi tandha. Ing Weka, label ditetepake minangka kelas:
// определяем атрибуты для признаков и меток
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);
...
Set Data lan Objek Sampel bisa disimpen lan dimuat saka file. Weka nggunakake ARFF (Attribute Relation File Format) sing didhukung dening benchmark grafis Weka. Dataset iki digunakake kanggo nglatih fungsi objektif sing dikenal minangka classifier ing Weka. Kaping pisanan, sampeyan kudu nemtokake fungsi objektif. Kode ing ngisor iki LinearRegressionbakal nggawe conto classifier. Klasifikasi iki bakal dilatih nggunakake buildClassifier(). Cara buildClassifier()milih paramèter theta adhedhasar data latihan kanggo nggoleki model target sing paling apik. Kanthi Weka, sampeyan ora perlu kuwatir babagan nyetel tingkat sinau utawa jumlah iterasi. Weka uga nindakake skala fitur kanthi mandiri.
Classifier targetFunction = new LinearRegression();
targetFunction.buildClassifier(trainingDataset);
Sawise setelan kasebut digawe, fungsi objektif bisa digunakake kanggo prédhiksi rega omah, kaya ing ngisor iki:
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));
Weka nyedhiyakake kelas Evaluationkanggo nguji klasifikasi utawa model sing dilatih. Ing kode ing ngisor iki, array data validasi sing dipilih digunakake kanggo ngindhari asil sing salah. Asil pangukuran (biaya kesalahan) bakal ditampilake ing konsol. Biasane, asil evaluasi digunakake kanggo mbandhingake model sing dilatih nggunakake algoritma pembelajaran mesin sing beda, utawa variasi kasebut:
Evaluation evaluation = new Evaluation(trainingDataset);
evaluation.evaluateModel(targetFunction, validationDataset);
System.out.println(evaluation.toSummaryString("Results", false));
Conto ing ndhuwur nggunakake regresi linier, sing prédhiksi angka numerik, kayata rega omah, adhedhasar nilai input. Regresi linier ndhukung prediksi nilai numerik sing terus-terusan. Kanggo prédhiksi nilai binar ("Ya" lan "Ora"), sampeyan kudu nggunakake algoritma pembelajaran mesin liyane. Contone, wit keputusan, jaringan saraf utawa regresi logistik.
// использование логистической регрессии
Classifier targetFunction = new Logistic();
targetFunction.buildClassifier(trainingSet);
Sampeyan bisa nggunakake salah siji saka algoritma iki, contone, kanggo prédhiksi apa pesen email spam, utawa prédhiksi cuaca, utawa prédhiksi apa omah bakal adol apik. Yen sampeyan pengin ngajari algoritma kanggo prédhiksi cuaca utawa sepira cepet omah bakal didol, sampeyan butuh set data sing beda, contone.topseller:
// использование атрибута маркера topseller instead of атрибута маркера цена
ArrayList<string> classVal = new ArrayList<>();
classVal.add("true");
classVal.add("false");

Attribute topsellerAttribute = new Attribute("topsellerLabel", classVal);
attributes.add(topsellerAttribute);
Dataset iki bakal digunakake kanggo nglatih klasifikasi anyar topseller. Yen wis dilatih, telpon prediksi kudu ngasilake indeks kelas token sing bisa digunakake kanggo entuk nilai sing diprediksi.
int idx = (int) targetFunction.classifyInstance(unlabeledInstances.get(0));
String prediction = classVal.get(idx);

Kesimpulan

Sanajan machine learning raket banget karo statistik lan nggunakake akeh konsep matematika, toolkit machine learning ngidini sampeyan miwiti nggabungake machine learning menyang program tanpa kawruh sing jero babagan matematika. Nanging, luwih apik sampeyan ngerti algoritma pembelajaran mesin sing ndasari, kayata algoritma regresi linier sing ditliti ing artikel iki, luwih sampeyan bakal bisa milih algoritma sing bener lan nyetel kanggo kinerja sing optimal. Terjemahan saka Inggris. Pengarang: Gregor Roth, Software Architect, JavaWorld.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION