JavaRush /Java Blogu /Random-AZ /Java Tərtibatçıları üçün Maşın Öyrənmə, 2-ci hissə

Java Tərtibatçıları üçün Maşın Öyrənmə, 2-ci hissə

Qrupda dərc edilmişdir
Java Tərtibatçıları üçün Maşın Öyrənmə, 1-ci hissə
Java Tərtibatçıları üçün Maşın Öyrənməsi, Hissə 2 - 1

Obyektiv Funksiya Qiymətləndirilməsi

Yada salaq ki, proqnozlaşdırma funksiyası kimi də tanınan hədəf funksiyası hazırlıq və ya təlim prosesinin nəticəsidir. хRiyazi cəhətdən problem dəyişəni giriş kimi qəbul edən və proqnozlaşdırılan dəyəri qaytaran funksiyanı tapmaqdır у.
Java Tərtibatçıları üçün Maşın Öyrənməsi, Hissə 2 - 2
Maşın öyrənməsində (J(θ))xəta dəyərini və ya verilmiş məqsəd funksiyasının “xərcini” hesablamaq üçün xərc funksiyasından istifadə edilir.
Java Tərtibatçıları üçün Maşın Öyrənməsi, 2-3-cü hissə
Xərc funksiyası modelin təlim məlumatlarına nə dərəcədə uyğun olduğunu göstərir. Yuxarıda göstərilən məqsəd funksiyasının dəyərini müəyyən etmək üçün hər bir nümunənin kvadrat səhvini hesablamaq lazımdır ev (i). Səhv hesablanmış dəyərlə nümunədən evin уreal dəyəri arasındakı məsafədir . yi
Java Tərtibatçıları üçün Maşın Öyrənməsi, Hissə 2 - 4
Məsələn, sahəsi 1330 = 6.500.000 € olan bir evin real qiyməti . Və öyrədilmiş məqsəd funksiyası ilə proqnozlaşdırılan ev qiyməti arasındakı fərq €7,032,478- dir : fərq (və ya səhv) €532,478- dir . Bu fərqi yuxarıdakı qrafikdə də görə bilərsiniz. Fərq (və ya xəta) hər bir qiymət sahəsi təlim cütü üçün şaquli kəsikli qırmızı xətlər kimi göstərilir. Təlim edilmiş məqsəd funksiyasının dəyərini hesabladıqdan sonra nümunədəki hər bir ev üçün kvadrat səhvini toplamalı və əsas dəyəri hesablamalısınız. Qiymət dəyəri nə qədər kiçik olsa (J(θ)), məqsəd funksiyamızın proqnozları bir o qədər dəqiq olacaqdır. Siyahı 3, giriş kimi məqsəd funksiyasını, təlim məlumatlarının siyahısını və onlarla əlaqəli etiketləri qəbul edən xərc funksiyasının sadə Java tətbiqini göstərir. Proqnoz dəyərləri bir döngədə hesablanacaq və səhv real qiymət dəyərini (etiketdən götürülmüş) çıxarmaqla hesablanacaq. Daha sonra xətaların kvadratı cəmlənəcək və xətanın dəyəri hesablanacaq. Xərc növün dəyəri kimi qaytarılacaq double:

Siyahı-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 haqqında oxumaq istəyirsiniz? Java Developer qrupuna qoşulun !

Hədəf funksiyasını öyrənmək

Xərc funksiyası hədəf funksiyasının və teta parametrlərinin keyfiyyətini qiymətləndirməyə kömək etsə də, hələ də ən uyğun teta parametrlərini tapmalısınız. Bunun üçün gradient eniş alqoritmindən istifadə edə bilərsiniz.

Qradient eniş

Gradient enişi xərc funksiyasını minimuma endirir. (J(θ))Bu o deməkdir ki, o , təlim məlumatlarına əsasən minimum qiymətə malik olan teta parametrlərini tapmaq üçün istifadə olunur . Yeni, daha uyğun teta dəyərlərini hesablamaq üçün sadələşdirilmiş alqoritm budur:
Java Tərtibatçıları üçün Maşın Öyrənməsi, Hissə 2 - 5
Beləliklə, teta vektorunun parametrləri alqoritmin hər iterasiyası ilə yaxşılaşacaq. Öyrənmə əmsalı α hər iterasiyada hesablamaların sayını müəyyən edir. Bu hesablamalar "yaxşı" teta dəyərləri tapılana qədər aparıla bilər. Məsələn, aşağıdakı xətti reqressiya funksiyası üç teta parametrinə malikdir:
Java Tərtibatçıları üçün Maşın Öyrənməsi, Hissə 2 - 6
Hər iterasiyada teta parametrlərinin hər biri üçün yeni dəyər hesablanacaq: , , və . Hər iterasiyadan sonra yeni teta vektorundan 0 , θ 1 , θ 2 } istifadə edərək yeni, daha uyğun tətbiq yaradıla bilər . Siyahı -4 gradient çürümə alqoritmi üçün Java kodunu göstərir. Reqressiya funksiyası üçün teta təlim məlumatlarından, marker məlumatlarından, öyrənmə sürətindən istifadə etməklə öyrədiləcək . Nəticə teta parametrlərindən istifadə edərək təkmilləşdirilmiş məqsəd funksiyası olacaq. Metod yeni məqsəd funksiyasını və əvvəlki hesablamalardan yeni teta parametrlərini keçərək təkrar-təkrar çağırılacaq. Və bu çağırışlar konfiqurasiya edilmiş məqsəd funksiyası minimum platoya çatana qədər təkrarlanacaq: θ0θ1θ2LinearRegressionFunction(α)train()

Siyahı - 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);
}
Xərclərin davamlı olaraq azalmasını təmin etmək üçün hər təlim addımından sonra xərc funksiyasını işə sala bilərsiniz J(θ). Hər iterasiyadan sonra xərclər azalmalıdır. Əgər bu baş vermirsə, bu o deməkdir ki, öyrənmə əmsalının dəyəri çox böyükdür və alqoritm sadəcə olaraq minimum dəyəri əldən verib. Belə olan halda qradiyent çürümə alqoritmi uğursuz olur. Aşağıdakı qrafiklər başlanğıc teta vektorundan başlayaraq yeni hesablanmış teta parametrlərindən istifadə edərək məqsəd funksiyasını göstərir {1.0, 1.0}. Sol sütun 50 təkrardan sonra proqnozlaşdırma funksiyasının planını göstərir; 200 təkrardan sonra orta sütun; və 1000 təkrardan sonra sağ sütun. Bunlardan görə bilərik ki, hər iterasiyadan sonra qiymət azalır və yeni məqsəd funksiyası daha yaxşı və daha yaxşı uyğun gəlir. 500-600 təkrardan sonra teta parametrləri artıq əhəmiyyətli dərəcədə dəyişmir və qiymət sabit platoya çatır. Bundan sonra, hədəf funksiyasının dəqiqliyi bu şəkildə yaxşılaşdırıla bilməz.
Java Tərtibatçıları üçün Maşın Öyrənməsi, Hissə 2 - 7
Bu halda, 500-600 təkrarlamadan sonra məsrəf artıq əhəmiyyətli dərəcədə azalmasa da, məqsəd funksiyası hələ də optimal deyil. Bu, uyğunsuzluğu göstərir . Maşın öyrənməsində "uyğunsuzluq" termini öyrənmə alqoritminin verilənlərdə əsas meylləri tapmadığını göstərmək üçün istifadə olunur. Real həyat təcrübəsinə əsaslansaq, çox güman ki, daha böyük mülklər üçün kvadrat metrə görə qiymətdə azalma gözlənilir. Buradan belə nəticəyə gələ bilərik ki, hədəf funksiyanın öyrənilməsi prosesi üçün istifadə olunan model verilənlərə kifayət qədər uyğun gəlmir. Uyğunsuzluq çox vaxt modelin həddindən artıq sadələşdirilməsi ilə bağlıdır. Bu, bizim vəziyyətimizdə baş verdi, məqsəd funksiyası çox sadədir və təhlil üçün bir parametrdən - evin sahəsindən istifadə edir. Amma bu məlumat evin qiymətini dəqiq proqnozlaşdırmaq üçün kifayət deyil.

Xüsusiyyətlərin əlavə edilməsi və onların miqyasının artırılması

Məqsəd funksiyanızın həll etməyə çalışdığınız problemə uyğun gəlmədiyini görsəniz, ona düzəliş edilməlidir. Uyğunsuzluğu düzəltməyin ümumi yolu xüsusiyyət vektoruna əlavə funksiyalar əlavə etməkdir. Bir evin qiyməti nümunəsində otaqların sayı və ya evin yaşı kimi xüsusiyyətləri əlavə edə bilərsiniz. Yəni, {size}evi təsvir etmək üçün bir xüsusiyyət dəyəri olan bir vektordan istifadə etmək əvəzinə, bir neçə dəyəri olan bir vektordan istifadə edə bilərsiniz, məsələn, {size, number-of-rooms, age}. Bəzi hallarda, mövcud təlim məlumatlarında xüsusiyyətlərin sayı kifayət deyil. Sonra mövcud olanlardan istifadə edərək hesablanan polinom xüsusiyyətlərini istifadə etməyə çalışmağa dəyər. Məsələn, bir evin qiymətini təyin etmək üçün obyektiv funksiyanı genişləndirmək imkanınız var ki, ona kvadrat metrin hesablanmış xüsusiyyətini (x2) daxil edin:
Java Tərtibatçıları üçün Maşın Öyrənməsi, Hissə 2 - 8
Çoxsaylı funksiyalardan istifadə etmək xüsusiyyət miqyasını tələb edir və bu, müxtəlif funksiyalar üzrə diapazonu standartlaşdırmaq üçün istifadə olunur. Beləliklə, 2 ölçülü atribut üçün dəyərlər diapazonu ölçü atributunun dəyərlər diapazonundan əhəmiyyətli dərəcədə böyükdür. Xüsusiyyət miqyası olmadan, ölçü 2 xərc funksiyasına əsassız şəkildə təsir edəcək. Ölçü 2 atributunun təqdim etdiyi xəta size atributunun təqdim etdiyi xətadan əhəmiyyətli dərəcədə böyük olacaq. Sadə bir xüsusiyyət miqyası alqoritmi aşağıda verilmişdir:
Java Tərtibatçıları üçün Maşın Öyrənməsi, Hissə 2 - 9
FeaturesScalingBu alqoritm aşağıdakı nümunə kodda sinifdə həyata keçirilir . Sinif FeaturesScalingtəlim məlumatlarına uyğunlaşdırılmış miqyaslama funksiyası yaratmaq üçün kommersiya metodunu təqdim edir. Daxili olaraq, təlim məlumat nümunələri orta, minimum və maksimum dəyərləri hesablamaq üçün istifadə olunur. Yaranan funksiya xüsusiyyət vektorunu götürür və miqyaslı xüsusiyyətlərə malik yenisini yaradır. Xüsusiyyətlərin miqyası aşağıda göstərildiyi kimi həm öyrənmə prosesi, həm də proqnozlaşdırma prosesi üçün lazımdır:
// создание массива данных
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);
Getdikcə daha çox xüsusiyyət əlavə olunduqca, məqsəd funksiyasına uyğunluq artır, lakin diqqətli olun. Əgər çox uzağa getsəniz və çoxlu funksiyalar əlavə etsəniz, həddən artıq uyğun olan obyektiv funksiyanı öyrənə bilərsiniz.

Həddindən artıq uyğunluq və çarpaz doğrulama

Məqsəd funksiyası və ya model təlim məlumatlarına çox yaxşı uyğunlaşdıqda, həddindən artıq uyğunlaşma baş verir ki, o, məşq məlumatlarında səs-küy və ya təsadüfi variasiyaları tutur. Həddindən artıq uyğunlaşma nümunəsi aşağıdakı ən sağdakı qrafikdə göstərilmişdir:
Java Tərtibatçıları üçün Maşın Öyrənməsi, Hissə 2 - 10
Bununla belə, həddindən artıq uyğun olan model təlim məlumatlarında çox yaxşı performans göstərir, lakin real naməlum məlumatlarda zəif çıxış edəcəkdir. Həddindən artıq uyğunlaşmağın qarşısını almaq üçün bir neçə yol var.
  • Təlim üçün daha böyük məlumat dəstindən istifadə edin.
  • Yuxarıdakı qrafiklərdə göstərildiyi kimi daha az funksiyadan istifadə edin.
  • Tənzimləməni nəzərə alan təkmilləşdirilmiş maşın öyrənmə alqoritmindən istifadə edin.
Proqnoz alqoritmi təlim məlumatlarını üstələsə, onun dəqiqliyinə fayda verməyən xüsusiyyətləri aradan qaldırmaq lazımdır. Çətinlik başqalarına nisbətən proqnozun düzgünlüyünə daha əhəmiyyətli təsir göstərən xüsusiyyətləri tapmaqdadır. Qrafiklərdə göstərildiyi kimi, həddən artıq uyğunlaşma qrafiklərdən istifadə edərək vizual olaraq müəyyən edilə bilər. Bu, 2 və ya 3 koordinatlı qrafiklər üçün yaxşı işləyir, 2-dən çox funksiyadan istifadə etsəniz, qrafiki tərtib etmək və qiymətləndirmək çətinləşir. Çapraz doğrulamada siz təlim prosesi başa çatdıqdan sonra alqoritmə məlum olmayan məlumatlardan istifadə edərək təlimdən sonra modelləri yenidən sınaqdan keçirirsiniz. Mövcud etiketli məlumatlar 3 dəstə bölünməlidir:
  • təlim məlumatları;
  • yoxlama məlumatları;
  • test məlumatları.
Bu halda, evləri xarakterizə edən etiketli qeydlərin 60 faizi hədəf alqoritmin variantlarının hazırlanması prosesində istifadə edilməlidir. Təlim prosesindən sonra qalan məlumatların yarısı (əvvəllər istifadə olunmamış) təlim keçmiş hədəf alqoritminin naməlum məlumatlar üzərində yaxşı performans göstərdiyini yoxlamaq üçün istifadə edilməlidir. Tipik olaraq, istifadə üçün digərlərindən daha yaxşı çıxış edən alqoritm seçilir. Qalan məlumatlar son seçilmiş model üçün səhv dəyərini hesablamaq üçün istifadə olunur. Digər çarpaz doğrulama üsulları var, məsələn k-fold . Ancaq bu məqalədə onları təsvir etməyəcəyəm.

Maşın öyrənmə vasitələri və Weka çərçivəsi

Əksər çərçivələr və kitabxanalar maşın öyrənmə alqoritmlərinin geniş kolleksiyasını təqdim edir. Bundan əlavə, onlar məlumat modellərinin öyrədilməsi, sınaqdan keçirilməsi və işlənməsi üçün rahat yüksək səviyyəli interfeys təqdim edirlər. Weka JVM üçün ən məşhur çərçivələrdən biridir. Weka, modelləri təsdiqləmək üçün qrafik testləri ehtiva edən praktiki Java kitabxanasıdır. Aşağıdakı nümunə, xüsusiyyətləri və etiketləri ehtiva edən təlim məlumat dəsti yaratmaq üçün Weka kitabxanasından istifadə edir. Metod setClassIndex()- işarələmək üçün. Weka-da etiket sinif kimi müəyyən edilir:
// определяем атрибуты для признаков и меток
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);
...
Data Set və Nümunə Obyekti fayldan saxlanıla və yüklənə bilər. Weka Weka-nın qrafik meyarları tərəfindən dəstəklənən ARFF (Atribut Əlaqəsi Fayl Formatından) istifadə edir. Bu verilənlər bazası Weka-da təsnifat kimi tanınan obyektiv funksiyanı öyrətmək üçün istifadə olunur. Əvvəlcə məqsəd funksiyasını təyin etməlisiniz. Aşağıdakı kod LinearRegressionklassifikatorun nümunəsini yaradacaq. Bu təsnifatçı istifadə edərək öyrədiləcək buildClassifier(). Metod buildClassifier()ən yaxşı hədəf modelinin axtarışında təlim məlumatlarına əsaslanaraq teta parametrlərini seçir. Weka ilə siz öyrənmə sürətini və ya təkrarlamaların sayını təyin etməkdən narahat olmaq məcburiyyətində deyilsiniz. Weka həmçinin müstəqil olaraq xüsusiyyət miqyasını həyata keçirir.
Classifier targetFunction = new LinearRegression();
targetFunction.buildClassifier(trainingDataset);
Bu parametrlər edildikdən sonra məqsəd funksiyası aşağıda göstərildiyi kimi evin qiymətini proqnozlaşdırmaq üçün istifadə edilə bilər:
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 öyrədilmiş təsnifatçı və ya modeli sınaqdan keçirmək üçün sinif təqdim edir . Aşağıdakı kodda yanlış nəticələrin qarşısını almaq üçün seçilmiş doğrulama məlumat massivi istifadə olunur. Ölçmə nəticələri (səhv dəyəri) konsolda göstəriləcək. Tipik olaraq, qiymətləndirmə nəticələri müxtəlif maşın öyrənmə alqoritmlərindən və ya bunların varyasyonlarından istifadə edərək təlim keçmiş modelləri müqayisə etmək üçün istifadə olunur:
Evaluation evaluation = new Evaluation(trainingDataset);
evaluation.evaluateModel(targetFunction, validationDataset);
System.out.println(evaluation.toSummaryString("Results", false));
Yuxarıdakı misalda, giriş dəyərlərinə əsaslanaraq, evin qiyməti kimi ədədi dəyərləri proqnozlaşdıran xətti reqressiya istifadə olunur. Xətti reqressiya davamlı ədədi dəyərlərin proqnozlaşdırılmasını dəstəkləyir. İkili dəyərləri ("Bəli" və "Xeyr") proqnozlaşdırmaq üçün digər maşın öyrənmə alqoritmlərindən istifadə etməlisiniz. Məsələn, qərar ağacı, neyron şəbəkələri və ya logistik reqressiya.
// использование логистической регрессии
Classifier targetFunction = new Logistic();
targetFunction.buildClassifier(trainingSet);
Siz bu alqoritmlərdən birini istifadə edə bilərsiniz, məsələn, e-poçt mesajının spam olub-olmadığını təxmin etmək və ya havanı proqnozlaşdırmaq və ya bir evin yaxşı satılıb satılmayacağını proqnozlaşdırmaq. Əgər alqoritminizə havanı və ya evin nə qədər tez satılacağını təxmin etməyi öyrətmək istəyirsinizsə, sizə fərqli məlumat dəsti lazımdır, məs.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 verilənlər bazası yeni təsnifatlaşdırıcının hazırlanması üçün istifadə olunacaq topseller. Təlim edildikdən sonra proqnoz çağırışı proqnozlaşdırılan dəyəri əldə etmək üçün istifadə edilə bilən əlamət sinfi indeksini qaytarmalıdır.
int idx = (int) targetFunction.classifyInstance(unlabeledInstances.get(0));
String prediction = classVal.get(idx);

Nəticə

Maşın öyrənməsinin statistika ilə sıx bağlı olmasına və bir çox riyazi anlayışlardan istifadə etməsinə baxmayaraq, maşın öyrənmə alətləri dəsti sizə riyaziyyat haqqında dərin biliyi olmadan maşın öyrənməsini proqramlarınıza inteqrasiya etməyə imkan verir. Bununla belə, bu məqalədə tədqiq etdiyimiz xətti reqressiya alqoritmi kimi əsas maşın öyrənmə alqoritmlərini nə qədər yaxşı başa düşsəniz, bir o qədər düzgün alqoritmi seçə və onu optimal performans üçün tənzimləyə biləcəksiniz. İngilis dilindən tərcümə . Müəllif: Gregor Roth, Software Architect, JavaWorld.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION