JavaRush /Java блогу /Random-KY /Java иштеп чыгуучулары үчүн машинаны үйрөнүү, 2-бөлүк

Java иштеп чыгуучулары үчүн машинаны үйрөнүү, 2-бөлүк

Группада жарыяланган
Java иштеп чыгуучулары үчүн машинаны үйрөнүү, 1-бөлүк
Java иштеп чыгуучулары үчүн машина үйрөнүү, 2 - 1-бөлүк

Максаттуу функцияны баалоо

Эске салсак, максаттуу функция , ошондой эле алдын ала айтуу функциясы катары белгилүү, даярдоо же окутуу процессинин натыйжасы. хМатематикалык жактан, кыйынчылык - өзгөрмөнү киргизүү катары кабыл алган жана болжолдонгон маанини кайтарган функцияны табуу у.
Java иштеп чыгуучулары үчүн машина үйрөнүү, 2 - 2-бөлүк
Машина үйрөнүүдө чыгымдын функциясы (J(θ))берилген максаттуу функциянын ката маанисин же "баасын" эсептөө үчүн колдонулат.
Java иштеп чыгуучулары үчүн машина үйрөнүү, 2 - 3-бөлүк
Наркы функция моделдин окутуу маалыматтарына канчалык туура келерин көрсөтөт. Жогоруда көрсөтүлгөн максаттуу функциянын баасын аныктоо үчүн ар бир мисалдын квадраттык катасын эсептөө керек (i). Ката - бул эсептелген маани менен үйдүн учыныгы наркынын ортосундагы аралык . yi
Java иштеп чыгуучулары үчүн машина үйрөнүү, 2 - 4-бөлүк
Мисалы, аянты 1330 = 6 500 000 € болгон үйдүн реалдуу баасы . Ал эми үйрөтүлгөн максат функциясы тарабынан болжолдонгон үй баасынын ортосундагы айырма € 7 032 478 : айырма (же ката) € 532 478 . Бул айырманы жогорудагы графиктен да көрө аласыз. Айырма (же ката) ар бир баа-аймак окутуу жуп үчүн тик сызык кызыл сызыктар катары көрсөтүлгөн. Үйрөтүлгөн максаттуу функциянын баасын эсептеп, мисалдагы ар бир үй үчүн квадраттык катаны кошуп, негизги маанини эсептөө керек. Баанын мааниси канчалык аз болсо (J(θ)), биздин максаттуу функциябыздын божомолдору ошончолук так болот. Листинг 3 an objectивдүү функцияны, окутуу маалыматтарынын тизмесин жана алар менен байланышкан энбелгилерди киргизүү катары кабыл алган чыгым функциясын жөнөкөй Java ишке ашырууну көрсөтөт. Божомолдоо маанилери циклде эсептелет жана ката чыныгы баанын маанисин (белгиден алынган) алып салуу менен эсептелет. Кийинчерээк каталардын квадраты жыйынтыкталып, катанын мааниси эсептелет. Наркы төмөнкү түрдөгү маани катары кайтарылат double:

Листинг-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 жөнүндө окууга кызыгасызбы? Java Developer тобуна кошулуңуз !

Максаттуу функцияны үйрөнүү

Наркы функция максаттуу функциянын сапатын жана тета параметрлерин баалоого жардам берет да, сиз дагы эле эң ылайыктуу тета параметрлерин табышыңыз керек. Бул үчүн градиенттин түшүү алгоритмин колдонсоңуз болот.

Градиенттин түшүүсү

Градиенттин түшүүсү чыгым функциясын азайтат. (J(θ))Бул окутуу маалыматтарынын негизинде минималдуу баасы бар тета параметрлерин табуу үчүн колдонулат дегенди билдирет . Бул жерде жаңы, ылайыктуу тета маанилерин эсептөө үчүн жөнөкөйлөштүрүлгөн алгоритм:
Java иштеп чыгуучулары үчүн машина үйрөнүү, 2 - 5-бөлүк
Ошентип, тета векторунун параметрлери алгоритмдин ар бир итерациясы менен жакшырат. Окуу коэффициенти α ар бир итерациядагы эсептөөлөрдүн санын көрсөтөт. Бул эсептөөлөр "жакшы" тета баалуулуктары табылганга чейин жүргүзүлүшү мүмкүн. Мисалы, төмөндөгү сызыктуу регрессия функциясы үч тета параметрине ээ:
Java иштеп чыгуучулары үчүн машина үйрөнүү, 2-6-бөлүк
Ар бир итерацияда тета параметрлеринин ар бири үчүн жаңы маани эсептелет: , , жана . Ар бир итерациядан кийин жаңы тета векторунун жардамы менен жаңы, ылайыктуу ишке ашыруу түзүлүшү мүмкүн 0 , θ 1 , θ 2 } . Листинг -4 градиенттин ажыроо алгоритми үчүн Java codeун көрсөтөт. Регрессия функциясы үчүн тета окуу маалыматтарын, маркер маалыматтарын, үйрөнүү ылдамдыгын колдонуу менен окутулат . Натыйжада тета параметрлерин колдонуу менен жакшыртылган максаттуу функция болот. Метод жаңы максат функциясын жана мурунку эсептөөлөрдөн жаңы тета параметрлерин өткөрүп, кайра-кайра чакырылат. Жана бул чалуулар конфигурацияланган максат функциясы минималдуу платого жеткенге чейин кайталанат: θ0θ1θ2LinearRegressionFunction(α)train()

Листинг-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);
}
Чыгым тынымсыз төмөндөшүн камсыздоо үчүн, J(θ)ар бир окуу кадамынан кийин чыгаша функциясын иштетсеңиз болот. Ар бир итерациядан кийин баасы төмөндөшү керек. Эгер андай болбосо, бул окуу коэффициентинин мааниси өтө чоң жана алгоритм жөн гана минималдуу маанини өткөрүп жиберди дегенди билдирет. Мындай учурда градиенттин ажыроо алгоритми иштебей калат. Төмөнкү графиктер тета векторунан баштап жаңы, эсептелген тета параметрлерин колдонуу менен максат функциясын көрсөтөт {1.0, 1.0}. Сол тилкеде 50 итерациядан кийин болжолдоо функциясынын графиги көрсөтүлөт; 200 кайталоодон кийин орто тилке; жана 1000 кайталоодон кийин оң тилке. Булардан биз баа ар бир итерациядан кийин төмөндөп, жаңы максат функциясы жакшыраак жана жакшыраак туура келерин көрүүгө болот. 500-600 кайталоодон кийин, тета параметрлери мындан ары олуттуу өзгөрбөйт жана баасы туруктуу платого жетет. Андан кийин, максаттуу функциянын тактыгын мындай жол менен жакшыртуу мүмкүн эмес.
Java иштеп чыгуучулары үчүн машина үйрөнүү, 2 - 7-бөлүк
Бул учурда, 500-600 итерациядан кийин чыгым мындан ары кыйла азайбаса да, максат функциясы дагы эле оптималдуу эмес. Бул карама-каршылыкты көрсөтүп турат . Машина үйрөнүүдө "ыраатсыздык" термини окутуу алгоритми маалыматтарда негизги тенденцияларды таппай турганын көрсөтүү үчүн колдонулат. Чыныгы турмуштук тажрыйбага таянсак, чоңураак an objectтер үчүн чарчы метрдин баасынын төмөндөшү күтүлөт. Мындан биз максаттуу функцияны үйрөнүү процесси үчүн колдонулган модель маалыматтарга жетиштүү дал келбейт деген тыянак чыгарууга болот. Дал келбестик көбүнчө моделдин өтө жөнөкөйлөштүрүлүшүнө байланыштуу. Бул биздин учурда болгон, максат милдети өтө жөнөкөй жана талдоо үчүн ал бир параметрди колдонот - үйдүн аянты. Бирок бул маалымат үйдүн баасын так айтууга аздык кылат.

Функцияларды кошуу жана аларды масштабдоо

Эгерде сиз максаттуу функцияңыз сиз чечүүгө аракет кылып жаткан маселеге дал келбей турганын байкасаңыз, аны тууралоо керек. Дал келбестикти оңдоонун кеңири таралган жолу - өзгөчөлүк векторуна кошумча функцияларды кошуу. Үйдүн баасынын мисалында бөлмөлөрдүн саны же үйдүн жашы сыяктуу мүнөздөмөлөрдү кошууга болот. Башкача айтканда, {size}үйдү сүрөттөө үчүн бир өзгөчөлүк мааниси бар векторду колдонуунун ордуна, бир нече мааниге ээ векторду колдонсоңуз болот, мисалы, {size, number-of-rooms, age}. Кээ бир учурларда, жеткorктүү окуу маалыматтарындагы функциялардын саны жетишсиз. Андан кийин бар болгондорду колдонуу менен эсептелген көп мүчөлүктү колдонууга аракет кылуу керек. Мисалы, сизде үйдүн баасын аныктоонун an objectивдүү функциясын кеңейтүү мүмкүнчүлүгү бар, анда ал чарчы метрдин (x2) эсептелген өзгөчөлүгүн камтыйт:
Java иштеп чыгуучулары үчүн машинаны үйрөнүү, 2 - 8-бөлүк
Бир нече функцияларды колдонуу өзгөчөлүк масштабын талап кылат , ал ар кандай функциялар боюнча диапазонду стандартташтыруу үчүн колдонулат. Ошентип, 2- өлчөмдүн атрибуту үчүн маанилердин диапазону өлчөм атрибуту үчүн маанилердин диапазонунан кыйла чоңураак. Функциянын масштабы болбосо, 2 -өлчөм чыгым функциясына негизсиз таасир этет. 2- өлчөм атрибуту киргизген ката, size атрибуту киргизген катадан кыйла чоң болот. Жөнөкөй функцияны масштабдоо алгоритми төмөндө келтирилген:
Java иштеп чыгуучулары үчүн машинаны үйрөнүү, 2 - 9-бөлүк
FeaturesScalingБул алгоритм төмөндөгү мисал codeундагы класста ишке ашырылган . Класс FeaturesScalingокутуу маалыматтарына ылайыкташтырылган масштабдоо функциясын түзүүнүн коммерциялык ыкмасын сунуштайт. Ички, окутуу маалымат инстанциялары орточо, минималдуу жана максималдуу маанилерди эсептөө үчүн колдонулат. Натыйжадагы функция функция векторун алып, масштабдуу өзгөчөлүктөрү менен жаңысын чыгарат. Функцияларды масштабдоо төмөндө көрсөтүлгөндөй, окуу процесси жана болжолдоо процесси үчүн зарыл:
// создание массива данных
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);
Барган сайын көбүрөөк функциялар кошулган сайын, максат функциясына ылайыктуулугу жогорулайт, бирок сак болуңуз. Эгерде сиз өтө эле алыс барып, өтө көп функцияларды кошсоңуз, анда сиз ашыкча an objectивдүү функцияны үйрөнүп калышыңыз мүмкүн.

Ашыкча дал келүү жана кайчылаш текшерүү

Ашыкча тууралоо максаттуу функция же модель машыгуу маалыматтарына өтө жакшы туура келгенде пайда болот, ошондуктан ал ызы-чуу же машыгуу маалыматтарындагы кокус өзгөрүүлөрдү кармап калат. Ашыкча тууралоонун мисалы төмөнкү эң оң жактагы графикте көрсөтүлгөн:
Java иштеп чыгуучулары үчүн машина үйрөнүү, 2 - 10-бөлүк
Бирок, ашыкча моделди окутуу маалыматтарында абдан жакшы аткарат, бирок чыныгы белгисиз маалыматтар боюнча начар иштейт. Ашыкча жабыштыруудан сактануунун бир нече жолу бар.
  • Тренинг үчүн чоңураак маалымат топтомун колдонуңуз.
  • Жогорудагы графиктерде көрсөтүлгөндөй азыраак функцияларды колдонуңуз.
  • Регуляризацияны эске алган жакшыртылган машина үйрөнүү алгоритмин колдонуңуз.
Эгерде алдын ала айтуу алгоритми окутуу маалыматтарынан ашып кетсе, анын тактыгына пайда алып келбеген функцияларды жок кылуу керек. Башкаларга караганда болжолдоонун тактыгына көбүрөөк таасир эткен өзгөчөлүктөрдү табуу кыйынчылыкта. Графиктерде көрсөтүлгөндөй, ашыкча туура келүүнү графиктердин жардамы менен визуалдык түрдө аныктоого болот. Бул 2 же 3 координаты бар графиктер үчүн жакшы иштейт, эгер сиз 2ден ашык функцияны колдонсоңуз, графикти түзүү жана баалоо кыйын болуп калат. Кайчылаш валидацияда сиз машыгуу процесси аяктагандан кийин алгоритмге белгисиз маалыматтарды колдонуу менен машыгуудан кийин моделдерди кайра сынайсыз. Жеткorктүү энбелгиленген маалыматтар 3 топтомго бөлүнүшү керек:
  • окутуу маалыматтары;
  • текшерүү маалыматтары;
  • тест маалыматтары.
Мында үйлөрдү мүнөздөгөн маркировкаланган жазуулардын 60 пайызы максаттуу алгоритмдин варианттарын окутуу процессинде колдонулушу керек. Окутуу процессинен кийин, калган маалыматтардын жарымы (мурда колдонулбаган) үйрөтүлгөн максаттуу алгоритм белгисиз маалыматтар боюнча жакшы иштешин текшерүү үчүн колдонулушу керек. Адатта, башкаларга караганда жакшыраак аткарган алгоритм колдонуу үчүн тандалып алынат. Калган маалыматтар акыркы тандалган модель үчүн ката маанисин эсептөө үчүн колдонулат. Башка кайчылаш текшерүү ыкмалары бар, мисалы, k-fold . Бирок, мен аларды бул макалада сүрөттөбөйм.

Машиналарды үйрөнүү куралдары жана Weka негизи

Көпчүлүк алHowтар ​​жана китепканалар машина үйрөнүү алгоритмдеринин кеңири коллекциясын камсыз кылат. Мындан тышкары, алар маалымат моделдерин окутуу, тестирлөө жана иштетүү үчүн ыңгайлуу жогорку деңгээлдеги интерфейсти камсыз кылат. Weka JVM үчүн эң популярдуу алHowтардын бири. Weka бул практикалык Java китепканасы, анда моделдерди текшерүү үчүн графикалык тесттер бар. Төмөнкү мисалда Weka китепканасы функцияларды жана энбелгилерди камтыган окуу маалымат топтомун түзүү үчүн колдонот. Метод setClassIndex()- белгилөө үчүн. Weka-жылы энбелги класс катары аныкталат:
// определяем атрибуты для признаков и меток
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);
...
Маалыматтар топтому жана үлгү an objectи файлдан сакталып, жүктөлүшү мүмкүн. Weka Weka графикалык эталондору тарабынан колдоого алынган ARFF (Attribute Relation File Format) колдонот. Бул маалымат топтому Weka классификатору деп аталган an objectивдүү функцияны үйрөтүү үчүн колдонулат. Биринчиден, сиз максаттуу функцияны аныкташыңыз керек. Төмөндөгү code LinearRegressionклассификатордун мисалын түзөт. Бул классификатор колдонуу менен окутулат buildClassifier(). Метод buildClassifier()мыкты максаттуу моделди издөөдө окутуу маалыматтарынын негизинде тета параметрлерин тандайт. Weka менен сиз үйрөнүү ылдамдыгын же итерациялардын санын коюу жөнүндө кабатырланбайсыз. Weka ошондой эле өз алдынча масштабдуу функцияларды аткарат.
Classifier targetFunction = new LinearRegression();
targetFunction.buildClassifier(trainingDataset);
Бул орнотуулар жасалгандан кийин, an objectивдүү функция төмөндө көрсөтүлгөндөй, үйдүн баасын болжолдоо үчүн колдонулушу мүмкүн:
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 үйрөтүлгөн классификаторду же моделди сыноо үчүн классты камсыз кылат . Төмөнкү codeдо туура эмес жыйынтыктарды болтурбоо үчүн валидация маалыматтарынын тандалган массивдери колдонулат. Өлчөөнүн натыйжалары (катанын баасы) консолдо көрсөтүлөт. Адатта, баалоо натыйжалары ар кандай машина үйрөнүү алгоритмдерин же алардын вариацияларын колдонуу менен үйрөтүлгөн моделдерди салыштыруу үчүн колдонулат:
Evaluation evaluation = new Evaluation(trainingDataset);
evaluation.evaluateModel(targetFunction, validationDataset);
System.out.println(evaluation.toSummaryString("Results", false));
Жогорудагы мисалда киргизилген маанилердин негизинде үйдүн баасы сыяктуу сандык маанилерди болжолдоочу сызыктуу регрессия колдонулат. Сызыктуу регрессия үзгүлтүксүз сандык маанилерди болжолдоону колдойт. Бинардык маанилерди ("Ооба" жана "Жок") болжолдоо үчүн, башка машина үйрөнүү алгоритмдерин колдонушуңуз керек. Мисалы, чечим дарагы, нейрон тармактары же логистикалык регрессия.
// использование логистической регрессии
Classifier targetFunction = new Logistic();
targetFunction.buildClassifier(trainingSet);
Сиз бул алгоритмдердин бирин колдоно аласыз, мисалы, электрондук почта билдирүүсү спам экенин алдын ала айтуу, же аба ырайын алдын ала айтуу, же үйдүн жакшы сатылаарын алдын ала айтуу үчүн. Эгер сиз алгоритмиңизди аба ырайын же үй канчалык тез сата турганын алдын ала айтууга үйрөткүңүз келсе, сизге башка маалымат топтому керек, мис.topseller:
// использование атрибута маркера topseller instead of атрибута маркера цена
ArrayList<string> classVal = new ArrayList<>();
classVal.add("true");
classVal.add("false");

Attribute topsellerAttribute = new Attribute("topsellerLabel", classVal);
attributes.add(topsellerAttribute);
Бул маалымат топтому жаңы классификаторду үйрөтүү үчүн колдонулат topseller. Ал үйрөтүлгөндөн кийин, алдын ала чакыруу болжолдонгон маанини алуу үчүн колдонула турган токен классынын индексин кайтарышы керек.
int idx = (int) targetFunction.classifyInstance(unlabeledInstances.get(0));
String prediction = classVal.get(idx);

Корутунду

Машиналарды үйрөнүү статистика менен тыгыз байланышта жана көптөгөн математикалык түшүнүктөрдү колдонсо да, машина үйрөнүү инструменттери математиканы терең билбестен эле программаларыңызга машина үйрөнүүнү интеграциялоону баштоого мүмкүндүк берет. Бирок, сиз бул макалада биз изилдеген сызыктуу регрессия алгоритми сыяктуу машинаны үйрөнүүнүн негизги алгоритмдерин канчалык жакшы түшүнсөңүз, ошончолук туура алгоритмди тандап, аны оптималдуу аткаруу үчүн тууралай аласыз. Англис тorнен котормо . Author: Грегор Рот, программалык камсыздоонун архитектору, JavaWorld.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION