portaldacalheta.pt
  • Основен
  • Kpi И Анализ
  • Инвеститори И Финансиране
  • Други
  • Финансови Процеси
Back-End

Изследване на контролирани алгоритми за машинно обучение



Основната цел на това четене е да разбере достатъчно статистическа методология, за да може да се възползва от алгоритмите за машинно обучение, които са в библиотеката scikit-learn на Python и след това приложете тези знания за решаване на класически проблем с машинното обучение.

Първата спирка на нашето пътуване ще ни преведе през кратка история на машинното обучение. След това ще се потопим в различни алгоритми. На последната ни спирка ще използваме наученото за решаване на Проблем с прогнозата за степента на оцеляване на Титаник .



Някои отказ от отговорност:



  • Аз съм софтуерен инженер пълен стак , а не експерт по алгоритми за машинно обучение.
  • Предполагам, че знаете нещо основно Python .
  • Това е проучвателно, така че не всички подробности са обяснени как би било урок .

С това казано, нека започнем!



Кратко въведение в алгоритмите за машинно обучение

Веднага щом се впуснете в тази област, вие осъзнавате това машинно обучение това е по-малко романтично, отколкото си мислите. Първоначално бях изпълнен с надежди, че след като научих повече, ще мога да изградя свой собствен AI Jarvis, че ще прекарам цял ден в софтуер за кодиране и печелене на пари за себе си, за да мога да прекарвам цели дни на открито в четене на книги, езда на мотоциклет и да се наслаждавам на безразсъден начин на живот, докато моят личен Джарвис кара джобовете ми да се задълбочават. Скоро обаче разбрах, че основата на алгоритмите за машинно обучение е статистиката, която аз лично намирам за скучна и безинтересна. За щастие се оказа, че „скучните“ статистики имат някои много завладяващи приложения.

Скоро ще откриете, че за да стигнете до тези завладяващи приложения, трябва много добре да разберете статистиката. Една от целите на алгоритмите за машинно обучение е да се намерят статистически зависимости в предоставените данни.



Предоставените данни могат да варират от проверка на кръвното налягане спрямо възрастта до намиране на ръкописен текст въз основа на цвета на различни пиксели.

С това казах, бях любопитен да видя дали можете да използвате алгоритми за машинно обучение, за да намерите зависимости в криптографските хеш функции (SHA, MD5 и др.) - но не можете да направите това, защото подходящите крипто примитиви са конструирани в такъв начин, по който те премахват зависимостите и дават резултати, които са значително трудни за предвиждане. Мисля, че като се има предвид безкрайно време, алгоритмите за машинно обучение могат да разбият всеки крипто модел.



За съжаление нямаме толкова много време, така че трябва да намерим друг начин за ефективно копаене на криптовалутата. Докъде стигнахме толкова далеч?

Кратка история на алгоритмите за машинно обучение

Корените на алгоритмите за машинно обучение идват от Томас Байес, който е бил английски статистик и е живял през 18 век. Неговата статия Есе за решаване на проблем в доктрината за възможностите подложки Теорема на Байес , който се прилага широко в областта на статистиката.



През 19 век Пиер-Симон Лаплас публикува Аналитична теория на вероятността , разширявайки работата на Байес и дефинирайки това, което днес познаваме като теория на Байес. Малко преди това Адриен-Мари Легендър описва метода на „най-малките квадрати“, който също е широко използван днес в контролираното обучение.

20 век е периодът, когато повечето от публично известните открития са направени в тази област. Андрей Марков изобретява вериги на Марков, които използва за анализ на стихове. Алън Тюринг предложи учебна машина, която би могла да стане изкуствено интелигентна, като по същество предвещава генетични алгоритми. Франк Розенблат изобретил Перцептрон , което предизвика голямо вълнение и голямо медийно отразяване.



Но след това, през 70-те години, имаше много песимизъм около идеята за ИИ и следователно намаляването на финансирането, поради което този период се нарича „зима“. Преоткриването на обратното размножаване през 80-те години предизвика възраждане в изследванията на машинното обучение. И днес това отново е гореща тема.

Покойният Лео Брейман направи разлика между два модела на статистическа парадигма. 'Алгоритмично моделиране', което означава повече или по-малко, алгоритми за машинно обучение, подобни на случайна гора .



Машинното обучение и статистиката са свързани области. Според Майкъл И. Джордан Идеите за машинно обучение, от методологични принципи до теоретични инструменти, имат дълга предистория в статистиката. Той също така предложи наука за запознанства като стабилен термин за общия проблем, върху който работят специалисти по машинно обучение и държавници.

Категории алгоритми за машинно обучение

Областта на машинното обучение се установява на два основни стълба, наречени контролирано обучение Y. учене без надзор . Някои хора обмислят и нова област на изследване като - дълбоко обучение —Това е отделно от често срещания въпрос за учене под наблюдение или без надзор.

Учене под наблюдение възниква, когато компютърът е представен с примери за входове и желаните от тях изходи. Целта е да се научат за общи формули, които съпоставят входовете с изходите. Това може да бъде разделено по следния начин:

  • Полууправлявано обучение , възниква, когато на компютъра се провежда непълно обучение, придружено от липсващи изходи
  • Активно обучение , възниква, когато компютърът може да получи етикети за обучение само за ограничен набор от екземпляри. Когато се използват интерактивно, вашите обучителни комплекти могат да бъдат представени на потребителя като маркирани
  • Укрепващо обучение , това се случва, когато данните за обучението се дават само като обратна връзка за действията на програмата в динамичната среда, като шофиране на превозно средство или игра на игра срещу противник

За разлика от тях учене без надзор Това се случва, когато не се предоставят етикети и зависи от алгоритъма да намери структурата в неговия вход. Ученето без надзор може да бъде самоцел, когато просто трябва да открием скрити модели.

Дълбоко обучение Това е нова област на изследване, която е вдъхновена от структурата и функциите на човешкия мозък, по същия начин се основава на изкуствени невронни мрежи, а не само на статистически концепции. Дълбокото учене може да се използва както в контролирани, така и в неподдържани подходи.

В тази статия ще разгледаме някои от най-простите контролирани алгоритми за машинно обучение и ще ги използваме, за да изчислим шансовете за оцеляване на индивида при трагичното потъване на титаника. Но като цяло, ако не сте сигурни кой алгоритъм да използвате, добро място за начало е лист за преглед на алгоритъма за машинно обучение scikit-learn .

Основни модели на контролирано машинно обучение

Може би най-простият алгоритъм е линейната регресия. Това понякога може да бъде представено графично като права линия, но въпреки името си, ако има полиномиална хипотеза, тази линия може да бъде крива. И в двата случая той моделира връзките между скаларна зависима променлива $ и $ и една или повече обяснителни стойности, обозначени с $ x $.

От гледна точка на неспециалисти това означава, че линейната регресия е алгоритъмът, който изучава зависимостта между всеки от вече известните $ x $ и $ y $, дотолкова, че да можем да го използваме за прогнозиране на $ y $ за неизвестна извадка от $ x $.

изграждане на отчет за паричните потоци

В първия ни пример за контролирано обучение ще използваме основен модел на линейна регресия, за да предскажем кръвното налягане на човек въз основа на възрастта му. изток това е много прост набор от данни с две важни характеристики: възраст и кръвно налягане.

Както бе споменато по-горе, повечето алгоритми за машинно обучение работят чрез намиране на статистическа зависимост от данните, които им се предоставят. Тази зависимост се нарича a хипотеза и обикновено се обозначава с $ h ( theta) $.

За да разгадаем тази хипотеза, нека започнем с изтегляне и проучване на данните.

import matplotlib.pyplot as plt from pandas import read_csv import os # Cargar datos data_path = os.path.join(os.getcwd(), 'data/blood-pressure.txt') dataset = read_csv(data_path, delim_whitespace=True) # Tenemos 30 entradas en nuestro set de data y cuatro características. La primera característica es la identificación de la entrada. # La segunda característica siempre es la nro. 1. La tercera es la edad y la última es la presión arterial. # Ahora dejaremos de lado la Identificación y la característica Uno por ahora, ya que no es importante. dataset = dataset.drop(['ID', 'One'], axis=1) # Y mostraremos esta gráfica %matplotlib inline dataset.plot.scatter(x='Age', y='Pressure') # Ahora, asumiremos que ya sabemos la hipótesis y parece una línea recta h = lambda x: 84 + 1.24 * x # ahora agreguemos esta línea a la gráfica ages = range(18, 85) estimated = [] for i in ages: estimated.append(h(i)) plt.plot(ages, estimated, 'b')

[]

Линейна хипотеза, показана в графика на възрастта спрямо кръвното налягане.

В графиката по-горе всяка синя точка представлява нашите примерни данни, а синята линия е хипотезата, която трябва да научи нашият алгоритъм. И така, каква е тази хипотеза?

За да разрешим този проблем, трябва да научим зависимостта между $ x $ и $ y $, която се обозначава с $ y = f (x) $. Следователно, $ f (x) $ е идеалната целева функция. Алгоритъмът за машинно обучение ще се опита да отгатне функцията на хипотезата $ h (x) $, която е най-близкото приближение на неизвестния $ f (x) $.

Най-простата форма на хипотеза за проблема с линейната регресия изглежда така: $ h_ theta (x) = theta_0 + theta_1 * x $. Имаме проста входна скаларна променлива $ x $, която извежда проста скаларна променлива $ y $, където $ theta_0 $ и $ theta_1 $ са параметри, които трябва да научим. Процесът на поставяне на тази синя линия в данните се нарича линейна регресия. Важно е да се разбере, че имаме само един входен параметър $ x_1 $; много от функциите на хипотезата обаче ще включват и единица с наклон ($ x_0 $). Така получената от нас хипотеза има формата на $ h_ theta (x) = theta_0 * x_0 + theta_1 * x_1 $. Но можем да избегнем писането на $ x_0 $, защото почти винаги е равно на 1.

Връщайки се към синята линия. Нашата хипотеза изглежда така: $ h (x) = 84 + 1.24x $, което означава, че $ theta_0 = 84 $ и $ theta_1 = 1.24 $. Как можем автоматично да извлечем тези стойности на $ theta $?

Трябва да определим a функция на разходите . По същество това, което прави разходна функция, е да изчисли корена на квадрат грешка между модела за прогнозиране и самия изход.

разлика между s и c corp
[J ( theta) = frac {1} {2m} sum_ {i = 1} ^ m (h_ theta (x ^ {(i)}) - y ^ {(i)}) ^ 2 ]

Например, нашата хипотеза предвижда, че за някой, който е на 48 години, кръвното му налягане трябва да бъде $ h (48) = 84 + 1,24 * 48 = 143mmHg $; в нашата извадка за обучение обаче имаме стойност от $ 130 mmHg $. Следователно грешката е $ (143 - 130) ^ 2 = $ 169. Сега трябва да изчислим тази грешка на всеки вход в набора ни от обучения, след което да добавим всичко заедно ($ sum_ {i = 1} ^ m (h_ theta (x ^ {(i)}) - y ^ {(i )}) ^ 2 $) и вземете значителната стойност от там. Това ни дава едно скаларно число, което представлява цената на функцията. Нашата цел е да намерим стойностите $ theta $, така че функцията на разходите да е по-ниска; с други думи, искаме да намалим функцията на разходите. Надяваме се, че това е интуитивно: ако имаме малка стойност на функцията на разходите, това означава, че грешката в прогнозирането също ще бъде ниска.

import numpy as np # Calculemos el costo para la hipótesis de arriba h = lambda x, theta_0, theta_1: theta_0 + theta_1 * x def cost(X, y, t0, t1): m = len(X) # the number of the training samples c = np.power(np.subtract(h(X, t0, t1), y), 2) return (1 / (2 * m)) * sum(c) X = dataset.values[:, 0] y = dataset.values[:, 1] print('J(Theta) = %2.2f' % cost(X, y, 84, 1.24))

J(Theta) = 1901.95

Сега трябва да намерим стойностите на $ theta $ толкова много, че стойността на нашия функция на разходите е минимално. Но как можем да направим това?

[minJ ( theta) = frac {1} {2m} sum_ {i = 1} ^ m (h_ theta (x ^ {(i)}) - y ^ {(i)}) ^ 2 ]

Има много възможни алгоритми, но най-популярният е градиент надолу . За да разберем интуицията зад метода за градиентно спускане, нека първо го поставим на графиката. За простота ще приемем по-проста хипотеза $ h ( theta) = theta_1 * x $. Тогава ще имаме проста 2D графика, където $ x $ е стойността на $ theta $, а $ y $ е разходната функция в този момент.

import matplotlib.pyplot as plt fig = plt.figure() # Genera los datos theta_1 = np.arange(-10, 14, 0.1) J_cost = [] for t1 in theta_1: J_cost += [ cost(X, y, 0, t1) ] plt.plot(theta_1, J_cost) plt.xlabel(r'$ heta_1$') plt.ylabel(r'$J( heta)$') plt.show()

Изпъкнала функция на разходите.

Функцията на разходите е изпъкнала, което означава, че в интервала $ [a, b] $ има само един минимум. Което означава, че най-добрите параметри $ theta $ са в точката, където разходната функция е най-ниска.

По принцип градиентното спускане е алгоритъм, който се опитва да намери набор от параметри, които минимизират функцията. Той започва с първоначален набор от параметри и предприема интерактивни стъпки към отрицателната посока на функцията за градиент.

Намерете минимума за функция на разходите.

Ако изчислим производната на хипотезна функция в определена точка, това ще ни даде директен достъп до допирателната линия до кривата в тази точка. Това означава, че можем да изчислим пряк път във всяка точка на графиката.

Начинът на работа на алгоритъма е следният:

  1. Избираме начална точка на случаен принцип ($ theta $ на случаен принцип).
  2. Намерете производната на функцията на разходите в този момент.
  3. Направете малката стъпка към прекия път $ theta_j: = theta_j - lambda * frac { частичен} { частичен theta_j} * J ( theta) $.
  4. Повторете стъпки 2-3 до сближаване.

Сега условието за конвергенция зависи от изпълнението на алгоритъма. Може би ще спрем след 50 стъпки, след някакъв нисък праг или нещо друго.

import math # Ejemplo del algoritmo simple de descenso gradiente tomado de Wikipedia cur_x = 2.5 # The algorithm starts at point x gamma = 0.005 # Step size multiplier precision = 0.00001 previous_step_size = cur_x df = lambda x: 2 * x * math.cos(x) # Recuerda la curva de aprendizaje y establécela while previous_step_size > precision: prev_x = cur_x cur_x += -gamma * df(prev_x) previous_step_size = abs(cur_x - prev_x) print('The local minimum occurs at %f' % cur_x)

El mínimo local pasa en 4.712194

Няма да прилагаме тези алгоритми в тази статия. Вместо това ще използваме вече приетата scikit-learn, библиотека за машинно обучение с отворен код на Python. Той предоставя много полезни API за различни проблеми с извличането на данни и машинното обучение.

De sklearn.linear_model importar LinearRegression # La Regresión Lineal usa el método de descenso gradiente # Nuestra data X = dataset[['Age']] y = dataset[['Pressure']] regr = LinearRegression() regr.fit(X, y) # Salidas Argumentadas plt.xlabel('Age') plt.ylabel('Blood pressure') plt.scatter(X, y, color='black') plt.plot(X, regr.predict(X), color='blue') plt.show() plt.gcf().clear()

Научена линейна хипотеза за кръвното налягане vs. Графика на възрастта

print( 'Predicted blood pressure at 25 y.o. = ', regr.predict(25) ) print( 'Predicted blood pressure at 45 y.o. = ', regr.predict(45) ) print( 'Predicted blood pressure at 27 y.o. = ', regr.predict(27) ) print( 'Predicted blood pressure at 34.5 y.o. = ', regr.predict(34.5) ) print( 'Predicted blood pressure at 78 y.o. = ', regr.predict(78) ) Predicted blood pressure at 25 y.o. = [[ 122.98647692]] Predicted blood pressure at 45 y.o. = [[ 142.40388395]] Predicted blood pressure at 27 y.o. = [[ 124.92821763]] Predicted blood pressure at 34.5 y.o. = [[ 132.20974526]] Predicted blood pressure at 78 y.o. = [[ 174.44260555]]

Видове статистически данни

Когато работите с проблеми с машинното обучение, е важно да знаете как да разпознавате различните видове данни. Това могат да бъдат цифрови (непрекъснати или дискретни), категорични или редови данни.

Числови данни те имат значение като мярка. Например: възраст, тегло, брой биткойни на човек или колко статии човек може да напише на месец. Числовите данни също могат да бъдат от дискретен или непрекъснат тип.

  • Дискретни данни представляват данни, които могат да бъдат преброени с цели числа, например броят на стаите в апартамент или времето на завъртане на монета.
  • Непрекъснатите данни не са непременно представени с цели числа. Например, ако измервате разстоянието, което можете да прескочите, то може да е 2 метра или 1,5 метра, или може би 1,6652245.

Категорични данни представляват ценности като пол на човека, семейно положение, държава и т.н. Тези данни могат да бъдат с числова стойност, но тези числа не биха имали математическа стойност. Не можете да ги добавите.

Поредни данни това може да бъде комбинация от други видове, при които категориите могат да бъдат номерирани по математически значим начин. Чест пример са рейтингите: Често се иска да оценяваме нещата по скала от едно до десет и в такива случаи са разрешени само цели числа. Въпреки че можем да използваме тези данни числено (например, за да намерим средния ранг на нещо), често използваме тези данни като категорични, когато прилагаме методи за машинно обучение.

Логистична регресия

Линейната регресия е невероятен алгоритъм, който ни помага да предскажем числени стойности като цената на къща с конкретен размер и определени стаи. Понякога обаче може да искаме да предскажем категорични данни, за да получим отговори на въпроси като:

  • Куче ли е или котка?
  • Този тумор злокачествен ли е или доброкачествен?
  • Това вино добро ли е или лошо?
  • Спам ли е този имейл или не?

Или дори:

  • Кое число е на тази снимка?
  • Към коя категория принадлежи този имейл?

Всички тези въпроси са специфични за проблем с класификацията . И се нарича най-простият алгоритъм за класификация Логистична регресия , което в крайна сметка е равно на регресията линейна Освен, че имате различна хипотеза.

На първо място, можем да използваме същата линейна хипотеза $ h_ theta (x) = theta ^ T X $ (това е във векторизирана форма). Докато линейната регресия може да изведе всяко число в интервалите $ [a, b] $, логистичната регресия може да получи стойности само в $ [- 1, 1] $, което се отнася до вероятността обектът да е от категория или не.

Ако използваме a сигмоидна функция , можем да преобразуваме всяка цифрова стойност, за да представлява стойност в диапазона $ [- 1, 1] $.

[f (x) = frac {1} {1 + e ^ x} ]

Сега вместо $ x $ ще трябва да предадем съществуваща хипотеза и ще получим:

[f (x) = frac {1} {1 + e ^ { theta_0 + theta_1 * x_1 + ... + theta_n * x_n}} ]

След това можем да приложим прост праг, който казва, че ако хипотезата е по-голяма от нула, тя ще бъде истинска стойност, в противен случай ще бъде невярна.

[h_ theta (x) = begin {случаи} 1 & mbox {ако} theta ^ T X> 0 \ 0 & mbox {else} end {случаи} ]

Това означава, че можем да използваме същото функция на разходите и същия низходящ градиентен алгоритъм за научаване на хипотеза на логистична регресия.

В следващия пример за машинно обучение ще посъветваме пилотите на космическата совалка дали трябва да контролират кацането ръчно или автоматично. Ние имаме много малък набор от данни —15 проби - състоящи се от шест характеристики и фундаментална истина .

В алгоритмите за машинно обучение терминът „ фундаментална истина ”Отнася се за точността на класификацията на учебните комплекти за контролирани техники на обучение.

Нашият набор от данни е пълен, което означава, че няма липсващи функции; въпреки това, някои функции имат '*' вместо категорията, което означава, че тази функция няма значение. Всички звездички като тази ще бъдат заменени с нули.

de sklearn.linear_model importar LogisticRegression # Data data_path = os.path.join(os.getcwd(), 'data/shuttle-landing-control.csv') dataset = read_csv(data_path, header=None, names=['Auto', 'Stability', 'Error', 'Sign', 'Wind', 'Magnitude', 'Visibility'], na_values='*').fillna(0) # Preparar características X = dataset[['Stability', 'Error', 'Sign', 'Wind', 'Magnitude', 'Visibility']] y = dataset[['Auto']].values.reshape(1, -1)[0] model = LogisticRegression() model.fit(X, y) # Por ahora nos falta un concepto importante. No sabemos qué tan bien funciona nuestro # modelo y debido a ello, en realidad no podemos mejorar el rendimiento de nuestra hipótesis. # Hay muchas métricas útiles pero por ahora, validaremos que tan bien # Actúa nuestro algoritmo en el set de datos, en el cual aprendió. 'La puntuación de nuestro modelo es %2.2f%%' % (model.score(X, y) * 100)

Puntuación de nuestro modelo es 73.33%

Валидиране?

В предишния пример проверихме ефективността на нашия модел, използвайки данните за обучение. Добър избор ли е обаче, като се има предвид, че нашият алгоритъм може или не може да пренебрегне данните? Нека да видим по-опростен пример, където имаме характеристика, която представлява размера на къща, и друга, която представлява цената.

de sklearn.pipeline importar make_pipeline de sklearn.preprocessing importer PolynomialFeatures de sklearn.linear_model importar LinearRegression de sklearn.model_selection importar cross_val_score # Función Verdad del terreno ground_truth = lambda X: np.cos(15 + np.pi * X) # Generar observaciones aleatorias alrededor de la función verdad del terreno n_samples = 15 degrees = [1, 4, 30] X = np.linspace(-1, 1, n_samples) y = ground_truth(X) + np.random.randn(n_samples) * 0.1 plt.figure(figsize=(14, 5)) models = {} # Trazar todos modelos del algoritmo de aprendizaje de máquina para idx, degree in enumerate(degrees): ax = plt.subplot(1, len(degrees), idx + 1) plt.setp(ax, xticks=(), yticks=()) # Definir el modelo polynomial_features = PolynomialFeatures(degree=degree) model = make_pipeline(polynomial_features, LinearRegression()) models[degree] = model # Entrenar el modelo model.fit(X[:, np.newaxis], y) # Evaluar el modelo usando validación cruzada scores = cross_val_score(model, X[:, np.newaxis], y) X_test = X plt.plot(X_test, model.predict(X_test[:, np.newaxis]), label='Model') plt.scatter(X, y, edgecolor='b', s=20, label='Observations') plt.xlabel('x') plt.ylabel('y') plt.ylim((-2, 2)) plt.title('Degree {} MSE = {:.2e}'.format( degree, -scores.mean())) plt.show()

Същите данни, моделирани от полиноми от първа, четвърта и тридесета степен, за да се демонстрира свръх генерализация и свръхсглобяване.

Моделът на алгоритъма за машинно обучение е свръх генерализирано ако не можете да обобщите нито данните от обучението, нито новите наблюдения. В горния пример използваме проста линейна хипотеза, която не представлява действителните данни за обучение и ще се представи много лошо. Обикновено свръхгенерализацията не се обсъжда, защото тя може лесно да бъде открита с добри измервания.

Ако нашият алгоритъм запомни всяко наблюдение, което му е било показано, тогава той ще се представи по-слабо с нови наблюдения, които са извън набора от данни за обучение. Това се казва преоборудване . Например, полиномиален модел от тридесета степен преминава повечето точки и постига добри резултати в тренировъчния набор, но всичко различно от това ще се представи слабо.

обработка на изключения при пролетно зареждане

Нашият набор от данни се състои от проста функция, която може да бъде нанесена в 2D; но в реалния живот бихме могли да имаме набори от данни със стотици характеристики, което ги прави невъзможни за визуално начертаване в евклидово пространство. Какви други опции трябва да видим, ако моделът е свръх генерализиран или свръхсглобен?

Време е да ви запозная с концепцията крива на обучение . Това е проста графика, която нанася квадратната грешка върху броя на тренировъчните проби.

В учебните материали ще намерите графики, подобни на тези:

Теоретични вариации на кривата на обучение на полиномиални графики.

Но в реалния живот може да не срещнете толкова перфектен образ. Нека начертаем кривата на обучение за всеки от нашите модели.

from sklearn.model_selection import learning_curve, ShuffleSplit # Trazar curvas de aprendizaje plt.figure(figsize=(20, 5)) for idx, degree in enumerate(models): ax = plt.subplot(1, len(degrees), idx + 1) plt.title('Degree {}'.format(degree)) plt.grid() plt.xlabel('Training examples') plt.ylabel('Score') train_sizes = np.linspace(.6, 1.0, 6) # Validación cruzada con 100 iteraciones para obtener una prueba sencilla de *mean* y entrenamiento # curvas de puntuación cada vez con 20% de los datos seleccionados aleatoriamente como set de validación. cv = ShuffleSplit(n_splits=100, test_size=0.2, random_state=0) model = models[degree] train_sizes, train_scores, test_scores = learning_curve( model, X[:, np.newaxis], y, cv=cv, train_sizes=train_sizes, n_jobs=4) train_scores_mean = np.mean(train_scores, axis=1) test_scores_mean = np.mean(test_scores, axis=1) plt.plot(train_sizes, train_scores_mean, 'o-', color='r', label='Training score') plt.plot(train_sizes, test_scores_mean, 'o-', color='g', label='Test score') plt.legend(loc = 'best') plt.show()

Резултати от обучението спрямо резултатите от теста за три графики с данни, формовани от полиноми от първа, четвърта и тридесета степен.

В нашия симулиран сценарий синята линия, представяща резултата от тренировката, изглежда като права линия. Всъщност намалява леко - можете да го видите в графиката на полинома от първа степен, но в останалите е твърде фин, за да се види при тази резолюция. Поне можем да видим, че има голяма разлика между кривите на обучение на обучението и наблюденията на теста със сценарий „висок наклон“.

В таблицата за класификация на „нормалното“ обучение в средата можете да видите как се съчетават линиите за обучение и тест.

часова ставка на свободна практика спрямо заплата

И в графиката „висока дисперсия“ можете да видите, че при малък брой проби, резултатите от теста и обучението са много сходни, но когато увеличите броя на тестовете, резултатът от обучението остава почти перфектен, докато тестът се увеличава далеч.


Можем да поправим свръх генерализирани модели (наричани още модели с голям наклон ) ако използваме нелинейна хипотеза, например хипотезата с повече полиномиални характеристики.

Нашият свръхмодел модел ( голяма вариация ) за всеки показан ви пример; но въпреки това, когато се въведат данни от теста, разликата между кривите на обучение се увеличава. Можем да използваме регуларизация, кръстосано валидиране и повече извадки от данни, за да поправим свръхмоделирани модели.

Кръстосано валидиране

Една от често срещаните практики, използвани за избягване на пренастройване, е да се запазят някои от наличните данни и да се използват като тестов набор. Въпреки това, когато се оценяват различни конфигурации на модела, като например броя на полиномиалните характеристики, все още съществува риск от пренастройване на набора от тестове, тъй като параметрите могат да бъдат леко променени, за да се постигне оптимално представяне на оценителя и затова нашите познания на тестовия комплект може да изтече в модела. За да разрешим този проблем, трябва да присвоим друга част от набора от данни, която се нарича „набор за проверка“. Обучението се извършва в обучителния комплект и когато вярваме, че сме постигнали оптималното представяне на модела, можем да направим оценката, като използваме валидиращия набор.

Ако обаче разделим данните на три набора, броят на извадките, които могат да бъдат използвани за обучение на моделите, ще бъде драстично намален и резултатите могат да зависят от конкретен случаен избор за двойката валидационно-обучителни набори.

Едно от решенията на този проблем е процедура, наречена кръстосана проверка. При стандартно кръстосано валидиране на $ k $, данните се разделят на $ k $ подмножества, наречени гънки. След това алгоритъмът се обучава итеративно с $ k-1 $ гънки, докато останалите гънки се използват като тестови набори (наречени ' издържащи плисета ”)

Решетка, показваща позицията на * holdout folds * при кръстосана k-fold проверка.

Кръстосаното валидиране позволява параметрите да се градуират само с оригиналния набор за обучение. Това ви позволява да запазите тестовия си набор като невидим набор от данни, за да изберете окончателния си модел.

Има много други техники за кръстосано валидиране като оставете Р навън , стратифициран $ k $ -кратно , разбъркване и разделяне и т.н. но те са извън обхвата на тази статия.

Регулиране

Това е друга техника, която може да ви помогне да решите проблема с пренастройването на модела. Повечето набори от данни имат модел и известен шум. Целта на регуларизацията е да се намали влиянието на шума върху модела.

Графика, съпоставяща оригинална функция и нейния узаконен аналог.

Има три основни техники за регулиране: Ласо, Тихонов и опъната мрежа.

L1 регуларизация (или Ласо регулиране ) е тази, която ще избере някои характеристики, които да се сведат до нула, така че те да нямат нищо общо с крайния модел. L1 може да се разглежда като метод за избор на важни характеристики.

** L2 регуларизация ** (или ** регулация на Тихонов **) е тази, която ще отговаря за принуждаването всичко характеристиките да са относително малки, така че да имат по-малко влияние върху модела.

Еластична мрежа е комбинация на L1 и L2.

Нормализация (скалираща характеристика)

Функцията за мащабиране също е важна стъпка, докато данните се обработват предварително. Нашият набор от данни може да има някои характеристики със стойности $ [- infty, infty] $ и други характеристики с различни мащаби. Това е метод, който ви позволява да стандартизирате диапазоните на независими стойности.

Функцията за мащабиране е важен процес за подобряване на ефективността на учебните модели. Преди всичко градиентното спускане ще се сближи много по-бързо, ако всички функции се мащабират до един и същ модел. По същия начин много от алгоритмите - например: поддържащи векторни машини (SVM) - работят чрез изчисляване на разстоянието между две точки и ако една от характеристиките има големи стойности, тогава разстоянието ще бъде силно повлияно от тази функция.

Поддържайте векторни машини

SVM (с името си на английски Поддържайте векторни машини ) е друг популярен алгоритъм за машинно обучение, който може да се използва за проблеми с класификацията и регресията. В SVM всяко наблюдение се нанася като точка в $ n $ размерно пространство - където $ n $ е броят на характеристиките, които имаме. Стойността на всяка характеристика е стойността на определени координати. След това се опитваме да намерим хиперплан, който много добре разделя два класа.

Графика, показваща хиперплан, разделящ два класа точки от данни с някои от техните вектори за поддръжка.

След като идентифицираме най-добрия хиперплан, ще искаме да добавим полета, които биха помогнали за по-нататъшното разделяне на двата класа.

Графика, показваща хиперплан с полета.

SVM е много ефективен, когато броят на функциите е много голям или ако броят на функциите е по-голям от броя на пробите от данни. Въпреки че, тъй като SVM обикновено работи с вектори, е изключително важно да се нормализират данните, преди да се използва.

Невронни мрежи

Алгоритмите на невронната мрежа са може би най-вълнуващият клон на машинното обучение. Невронните мрежи се опитват да имитират връзката на невроните в мозъка.

Илюстрация на невронна мрежа, показваща няколко изхода, съпоставени с времеви стойности, които от своя страна се установяват, че приличат на един изход.

Ето как върви невронната мрежа. Ние комбинираме много възли, където всеки възел взема набор от изходи, прави някои изчисления и след това извежда стойност.

Съществува голямо разнообразие от невронни мрежови алгоритми както за контролирано, така и за ненаблюдавано обучение. Невронните мрежи могат да се използват за шофиране на автономни автомобили, игра на видео игри, наземни самолети, класифициране на изображения и др.

Скандалният Титаник

RMS Titanic е британски кораб, който потъва в Северния Атлантически океан на 15 април 1912 г. след сблъсък с айсберг. На борда са имали около 2224 пътници и екипаж, над 1500 от които са загинали, което го прави едно от най-смъртоносните търговски морски бедствия в последно време.

Сега, когато разбираме интуицията на един от най-основните алгоритми за машинно обучение, използван за класификация на проблемите, можем да приложим знанията си, за да предскажем степента на оцеляване на хората на борда на Титаник.

Нашият набор от данни ще дойде от Платформата за научни данни за конкурентоспособността на Kaggle .

import os from pandas import read_csv, concat # Cargar datos data_path = os.path.join(os.getcwd(), 'data/titanic.csv') dataset = read_csv(data_path, skipinitialspace=True) dataset.head(5)
PassengerId Оцелял Клас Име Секс Възраст SibSp уважение Билет Да направя Кабина Качил се
0 един 0 3 Браунд, господин Оуен Харис мъжки 22,0 един 0 A / 5 21171 7.2500 NaN С
един 2 един един Cumings, г-жа Джон Брадли (Флорънс Бригс Th ... женски пол 38,0 един 0 PC 17599 71,2833 С85 ° С
2 3 един 3 Хейкинен, госпожице. Заем женски пол 26,0 0 0 КАМЪК / O2. 3101282 7,9250 NaN С
3 4 един един Futrelle, г-жа Jacques Heath (Lily May Peel) женски пол 35,0 един 0 113803 53.1000 С123 С
4 5 0 3 Алън, господин Уилям Хенри мъжки 35,0 0 0 373450 8.0500 NaN С

Първата ни стъпка ще бъде да заредим и проучим данните. Имаме 891 протокола от тестове; всеки запис има следната структура:

  • passengerId - ИД на пътника на борда
  • оцеляване - Независимо дали човекът е оцелял или не при инцидента
  • pclase - Тип билет, напр. 1-ви, 2-ри, 3-ти
  • пол - Пътнически пол: Мъж или жена
  • име - включено заглавие
  • възраст - Възраст в години
  • sibsp - Брой роднини / съпрузи на борда на Титаник
  • перх - Брой родители / деца на борда на Титаник
  • билет - Номер на билета
  • тарифа - цена на билета
  • кабина - Номер на кабината
  • качен - Пристанище на кораба

Този набор от данни съдържа както цифрова, така и категорична информация. Обикновено е добра идея да се задълбочите в данните, които имате, и въз основа на тях да създадете предположения. В този случай обаче ще пропуснем тази стъпка и ще преминем направо към прогнозите.

import pandas as pd # Necesitamos eliminar algunas características insignificantes y mapear el resto. # Número y costo del boleto no deberían contribuir en el rendimiento de nuestro modelo. # Característica de nombres viene con títulos (como: Sr. Srta. Doctor) incluidos. # El género es muy importante. # El Puerto de embarcación podría ser atribuir algún valor. # Usar el Puerto de embarcación podría ser contra-intuitivo pero podría # existir una tasa de supervivencia más alta para pasajeros que abordaron en el mismo Puerto. dataset['Title'] = dataset.Name.str.extract(' ([A-Za-z]+).', expand=False) dataset = dataset.drop(['PassengerId', 'Ticket', 'Cabin', 'Name'], axis=1) pd.crosstab(dataset['Title'], dataset['Sex'])
Заглавие Пол женски пол мъжки
Капитан 0 един
С 0 2
Графиня един 0
Дон 0 един
Д-р един 6
Jonkheer 0 един
Дама един 0
Майор 0 2
Учителю 0 40
Госпожице 182 0
г-ца 2 0
Г-жа един 0
г-н 0 517
Г-жа 125 0
г-ца един 0
Преп 0 6
Сър 0 един
# Reemplazaremos muchos títulos con un nombre más común, equivalente Inglés, # o re-clasificación dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Other') dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss') dataset['Title'] = dataset['Title'].replace('Ms', 'Miss') dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs') dataset[['Title', 'Survived']].groupby(['Title'], as_index=False).mean()
Заглавие Оцелял
0 Учителю 0,575000
един Госпожице 0,702703
2 г-н 0,156673
3 Г-жа 0,793651
4 Други 0,347826
# Ahora mapearemos categorias alfanumericas a números title_mapping = { 'Mr': 1, 'Miss': 2, 'Mrs': 3, 'Master': 4, 'Other': 5 } gender_mapping = { 'female': 1, 'male': 0 } port_mapping = { 'S': 0, 'C': 1, 'Q': 2 } # Mapa de título dataset['Title'] = dataset['Title'].map(title_mapping).astype(int) # Mapa de género dataset['Sex'] = dataset['Sex'].map(gender_mapping).astype(int) # Mapa de puerto freq_port = dataset.Embarked.dropna().mode()[0] dataset['Embarked'] = dataset['Embarked'].fillna(freq_port) dataset['Embarked'] = dataset['Embarked'].map(port_mapping).astype(int) # Arreglar errores de edades que falten dataset['Age'] = dataset['Age'].fillna(dataset['Age'].dropna().median()) dataset.head()
Оцелял Клас Секс Възраст SibSp уважение Да направя Качил се Заглавие
0 0 3 0 22,0 един 0 7.2500 0 един
един един един един 38,0 един 0 71,2833 един 3
2 един 3 един 26,0 0 0 7,9250 0 2
3 един един един 35,0 един 0 53.1000 0 3
4 0 3 0 35,0 0 0 8.0500 0 един

На този етап ще класифицираме различни видове алгоритми за машинно обучение в Python, използвайки scikit-learn за да създадете различен набор от модели. Ще бъде лесно да се види кой се представя по-добре.

  • Логистична регресия с полиноми с вариативни числа
  • Поддръжка на векторна машина с линейно ядро
  • Поддръжка на векторна машина с многочленово ядро
  • Червен неврон

За всеки от моделите ще използваме проверката на $ k $ -кратно.

de sklearn.model_selection importar KFold, train_test_split de sklearn.pipeline importar make_pipeline de sklearn.preprocessing importar PolynomialFeatures, StandardScaler de sklearn.neural_network importar MLPClassifier de sklearn.svm importar SVC # Preparar data X = dataset.drop(['Survived'], axis = 1).values y = dataset[['Survived']].values X = StandardScaler().fit_transform(X) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = None) # Prepare cross-validation (cv) cv = KFold(n_splits = 5, random_state = None) # Rendimiento p_score = lambda model, score: print('Performance of the %s model is %0.2f%%' % (model, score * 100)) # Clasificadores names = [ 'Logistic Regression', 'Logistic Regression with Polynomial Hypotheses', 'Linear SVM', 'RBF SVM', 'Neural Net', ] classifiers = [ LogisticRegression(), make_pipeline(PolynomialFeatures(3), LogisticRegression()), SVC(kernel='linear', C=0.025), SVC(gamma=2, C=1), MLPClassifier(alpha=1), ] # iterate over classifiers models = [] trained_classifiers = [] for name, clf in zip(names, classifiers): scores = [] for train_indices, test_indices in cv.split(X): clf.fit(X[train_indices], y[train_indices].ravel()) scores.append( clf.score(X_test, y_test.ravel()) ) min_score = min(scores) max_score = max(scores) avg_score = sum(scores) / len(scores) trained_classifiers.append(clf) models.append((name, min_score, max_score, avg_score)) fin_models = pd.DataFrame(models, columns = ['Name', 'Min Score', 'Max Score', 'Mean Score']) fin_models.sort_values(['Mean Score']).head()
Име Моят резултат Максимален резултат Среден резултат
2 Линеен SVM 0,793296 0.821229 0,803352
0 Логистична регресия 0,826816 0,860335 0,846927
4 Невронна мрежа 0,826816 0,860335 0,849162
един Логистична регресия с полиномиални хипотези 0,854749 0,882682 0,869274
3 RBF SVM 0,843575 0,888268 0,869274

Е, нашето експериментално изследване ни казва, че SVM класификаторът има най-добра производителност с ядро ​​с радиална основна функция (RBF). Сега можем да сериализираме нашия модел и да го използваме повторно в производствени приложения.

научаване на кодиране в c
import pickle svm_model = trained_classifiers[3] data_path = os.path.join(os.getcwd(), 'best-titanic-model.pkl') pickle.dump(svm_model, open(data_path, 'wb'))

Машинното обучение не е сложно, но е много широка област на обучение и изисква знания в областта на математиката и статистиката, за да се разберат всичките му понятия.

В момента машинното обучение и дълбокото обучение са сред най-търсените теми за дискусии, най-вече защото те могат да автоматизират много повтарящи се задачи като разпознаване на глас, шофиране на автомобили, финансова търговия, грижи за пациента , готвач , маркетинг , наред с много други.

Сега с тези знания можете да решите предизвикателствата в Kaggle.

Това беше кратко въведение в контролирания алгоритъм за машинно обучение. За щастие има много онлайн курсове и информация за алгоритмите за машинно обучение. Аз лично препоръчвам да започнете с курса на Андрю Нг по Coursera.

Източници

  • Andrew Ng Курс в Coursera
  • Набори от данни Kaggle
  • Списък за четене за дълбоко обучение
  • Списък с безплатни книги за алгоритми за машинно обучение, извличане на данни, задълбочено обучение и свързани теми
  • Въведение в теорията на машинното обучение и нейните приложения: Визуален урок с примери

Урок за физика на видеоигри - Част I: Въведение в динамиката на твърдо тяло

Технология

Урок за физика на видеоигри - Част I: Въведение в динамиката на твърдо тяло
Приложения на статистиката за измерване на фирмения растеж

Приложения на статистиката за измерване на фирмения растеж

Финансови Процеси

Популярни Публикации
Първи стъпки с модули и модулна разработка отпред
Първи стъпки с модули и модулна разработка отпред
Най-добри практики за уеб оформление: Анализирани са 12 вечни модела на потребителския интерфейс
Най-добри практики за уеб оформление: Анализирани са 12 вечни модела на потребителския интерфейс
H-1B: Пътешествие на разработчика на iOS от Хондурас до Силициевата долина
H-1B: Пътешествие на разработчика на iOS от Хондурас до Силициевата долина
Agile UX: Как да включите UX и продуктовия дизайн в Agile
Agile UX: Как да включите UX и продуктовия дизайн в Agile
Съвети за привличане, управление и задържане на разработчици на софтуер
Съвети за привличане, управление и задържане на разработчици на софтуер
 
Въведение в търговията с дълбоко обучение в хедж фондове
Въведение в търговията с дълбоко обучение в хедж фондове
Magento 2: Ревизия или революция?
Magento 2: Ревизия или революция?
Кутия с инструменти на Forecaster’s: Как да извършите симулации на Монте Карло
Кутия с инструменти на Forecaster’s: Как да извършите симулации на Монте Карло
Ръководител на растежа
Ръководител на растежа
Вицепрезидент по комуникациите
Вицепрезидент по комуникациите
Популярни Публикации
  • какво ви позволяват да направите новите технологии, разработени по време на Студената война?
  • Въпроси за интервю за модели на javascript дизайн
  • в какво пише windows 10
  • колко дрона са продадени през 2016 г
  • проблеми с лош дизайн на база данни
  • c++ език за кодиране
  • какво е атрибут в python
Категории
  • Kpi И Анализ
  • Инвеститори И Финансиране
  • Други
  • Финансови Процеси
  • © 2022 | Всички Права Запазени

    portaldacalheta.pt