Как да започнем с машинно обучение за около 10 минути

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

Въведение в машинното обучение с Python

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

Колко лесно

for anything in the_list: print(anything)

Толкова лесно . Синтаксисът е тясно свързан с английски (или човешки език, а не машина). И няма глупави къдрави скоби, които да объркват хората. Имам колега, която е в системата за осигуряване на качеството, а не софтуерен инженер, и тя може да напише кода на Python в рамките на един ден на производствено ниво. (Наистина!)

Така че строителите на библиотеките, които ще обсъдим по-долу, избраха Python за своя избор на език. И като анализатор на данни и учен, ние можем просто да използваме техните шедьоври, за да ни помогнат да изпълним задачите. Това са невероятните библиотеки, които са задължителни за машинно обучение с Python .

  1. Numpy

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

2. Панди

За обработка на CSV файлове. Разбира се, ще трябва да обработите някои таблици и да видите статистика и това е правилният инструмент, който искате да използвате.

3. Matplotlib

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

4. Seaborn

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

5. Scikit-Learn

Това е последният шеф на машинното обучение с Python. ТАК НАРЕЧЕНОТО машинно обучение с Python е този човек. Scikit-Learn. Всички неща, от които се нуждаете от алгоритми до подобрения, са тук.

6. Tensorflow и Pytorch

Не говоря твърде много за тези двама. Но ако се интересувате от Дълбоко обучение, погледнете ги, ще си струва времето. (Ще дам още един урок за дълбокото обучение следващия път, останете на линия!)

Проекти за машинно обучение на Python

Разбира се, четенето и ученето сами няма да ви доведат там, където трябва да отидете. Имате нужда от реална практика. Както казах в моя блог, изучаването на инструментите е безсмислено, ако не влезете в данните. И така, представям ви място, където можете лесно да намерите проекти за машинно обучение на Python.

Kaggle е платформа, където можете да се потопите директно в данните. Ще решавате проекти и ще станете наистина добри в машинното обучение. Нещо, което може да ви заинтересува повече: състезанията по машинно обучение, които провежда, могат да дадат награда до 100 000 долара. И може да искате да опитате късмета си. Хаха.

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

Ето примерен проект, който ще използваме в урока по-долу:

Титаник: Машинно обучение от катастрофа

Да, скандалният Титаник. Трагично бедствие през 1912 г., отнело живота на 1502 души от 2224 пътници и екипаж. Това състезание на Kaggle (или мога да кажа урок) ви дава реалните данни за бедствието. И вашата задача е да обясните данните, така че да можете да предскажете дали някой човек е оцелял или не по време на инцидента.

Машинно обучение с уроци по Python

Преди да навлезем дълбоко в данните на Титаник, нека инсталираме някои инструменти, от които се нуждаете.

Разбира се, Python. Първо трябва да го инсталирате от официалния уебсайт на Python. Трябва да инсталирате версия 3.6+, за да сте в крак с библиотеките.

След това трябва да инсталирате всички библиотеки чрез Python pip. Pip трябва да се инсталира автоматично с дистрибуцията на Python, която току-що изтеглихте.

След това инсталирайте нещата, от които се нуждаете, чрез pip. Отворете терминала, командния ред или Powershell и напишете следното:

pip install numpypip install pandaspip install matplotlibpip install seabornpip install scikit-learnpip install jupyter

Е, всичко изглежда добре. Но чакай, какво е jupyter? Юпитер означава Джулия, Питон и R, следователно Юпитър. Но това е странно съчетание от думи, така че те го превърнаха в просто Юпитер. Това е известна тетрадка, в която можете да пишете Python код интерактивно.

Просто напишете тефтер jupyter във вашия терминал и ще отворите страница на браузъра като тази:

Напишете кода в зеления правоъгълник и можете да пишете и оценявате Python кода интерактивно.

Сега сте инсталирали всички инструменти. Нека да тръгваме!

Изследване на данни

Първата стъпка е да изследвате данните. Трябва да изтеглите данните от страницата на Титаник в Kaggle. След това поставете извлечените данни в папка, от която стартирате вашия бележник Jupyter.

След това импортирайте необходимите библиотеки:

import numpy as np import pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warningswarnings.filterwarnings('ignore')%matplotlib inline

След това заредете данните:

train_df=pd.read_csv("train.csv")train_df.head()

Ще видите нещо подобно:

Това са нашите данни. Той има следните колони:

  1. PassengerId, идентификаторът на пътника
  2. Оцелял, независимо дали е оцелял или не
  3. Pclass, класът на услугата, може би 1 е икономичен, 2 е бизнес и 3 е първи клас
  4. Име, името на пътника
  5. Секс
  6. Възраст
  7. Sibsp, или братя и сестри и съпрузи, брой братя и сестри и съпрузи на борда
  8. Парк, или родители и деца, брой от тях на борда
  9. Билет, подробности за билета
  10. Cabin, their cabin. NaN means unknown
  11. Embarked, the origin of embarkation, S for Southampton, Q for Queenstown, C for Cherbourg

While exploring data, we often find missing data. Let’s see them:

def missingdata(data): total = data.isnull().sum().sort_values(ascending = False) percent = (data.isnull().sum()/data.isnull().count()*100).sort_values(ascending = False) ms=pd.concat([total, percent], axis=1, keys=['Total', 'Percent']) ms= ms[ms["Percent"] > 0] f,ax =plt.subplots(figsize=(8,6)) plt.xticks(rotation='90') fig=sns.barplot(ms.index, ms["Percent"],color="green",alpha=0.8) plt.xlabel('Features', fontsize=15) plt.ylabel('Percent of missing values', fontsize=15) plt.title('Percent missing data by feature', fontsize=15) return ms
missingdata(train_df)

We will see a result like this:

The cabin, age, and embarked data has some missing values. And cabin information is largely missing. We need to do something about them. This is what we call Data Cleaning.

Data Cleaning

This is what we use 90% of the time. We will do Data Cleaning a lot for every single Machine Learning project. When the data is clean, we can easily jump ahead to the next step without worrying about anything.

The most common technique in Data Cleaning is filling missing data. You can fill the data missing with Mode, Mean, or Median. There is no absolute rule on these choices — you can try to choose one after another and see the performance. But, for a rule of thumb, you can only use mode for categorized data, and you can use median or mean for continuous data.

So let’s fill the embarkation data with Mode and the Age data with median.

train_df['Embarked'].fillna(train_df['Embarked'].mode()[0], inplace = True)train_df['Age'].fillna(train_df['Age'].median(), inplace = True)

The next important technique is to just remove the data, especially for largely missing data. Let’s do it for the cabin data.

drop_column = ['Cabin']train_df.drop(drop_column, axis=1, inplace = True)

Now we can check the data we have cleaned.

print('check the nan value in train data')print(train_df.isnull().sum())

Perfect! No missing data found. Means the data has been cleaned.

Feature Engineering

Now we have cleaned the data. The next thing we can do is Feature Engineering.

Feature Engineering is basically a technique for finding Feature or Data from the currently available data. There are several ways to do this technique. More often, it is about common sense.

Let’s take a look at the Embarked data: it is filled with Q, S, or C. The Python library will not be able to process this, since it is only able to process numbers. So you need to do something called One Hot Vectorization, changing the column into three columns. Let’s say Embarked_Q, Embarked_S, and Embarked_C which are filled with 0 or 1 whether the person embarked from that harbor or not.

The other example is SibSp and Parch. Maybe there is nothing interesting in both of those columns, but you might want to know how big the family was of the passenger who boarded in the ship. You might assume that if the family was bigger, then the chance of survival would increase, since they could help each other. On other hand, solo people would’ve had it hard.

So you want to create another column called family size, which consists of sibsp + parch + 1 (the passenger themself).

The last example is called bin columns. It is a technique which creates ranges of values to group several things together, since you assume it is hard to differentiate things with similar value. For example, Age. For a person aged 5 and 6, is there any significant difference? or for person aged 45 and 46, is there any big difference?

That’s why we create bin columns. Maybe for age, we will create 4 bins. Children (0–14 years), Teenager (14–20), Adult (20–40), and Elders (40+)

Let’s code them:

all_data = train_df
for dataset in all_data : dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1
import re# Define function to extract titles from passenger namesdef get_title(name): title_search = re.search(' ([A-Za-z]+)\.', name) # If the title exists, extract and return it. if title_search: return title_search.group(1) return ""# Create a new feature Title, containing the titles of passenger namesfor dataset in all_data: dataset['Title'] = dataset['Name'].apply(get_title)# Group all non-common titles into one single grouping "Rare"for dataset in all_data: dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss') dataset['Title'] = dataset['Title'].replace('Ms', 'Miss') dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')
for dataset in all_data: dataset['Age_bin'] = pd.cut(dataset['Age'], bins=[0,14,20,40,120], labels=['Children','Teenage','Adult','Elder'])
for dataset in all_data: dataset['Fare_bin'] = pd.cut(dataset['Fare'], bins=[0,7.91,14.45,31,120], labels ['Low_fare','median_fare', 'Average_fare','high_fare']) traindf=train_dffor dataset in traindf: drop_column = ['Age','Fare','Name','Ticket'] dataset.drop(drop_column, axis=1, inplace = True)
drop_column = ['PassengerId']traindf.drop(drop_column, axis=1, inplace = True)traindf = pd.get_dummies(traindf, columns = ["Sex","Title","Age_bin","Embarked","Fare_bin"], prefix=["Sex","Title","Age_type","Em_type","Fare_type"])

Now, you have finished all the features. Let’s take a look into the correlation for each feature:

sns.heatmap(traindf.corr(),annot=True,cmap='RdYlGn',linewidths=0.2) #data.corr()-->correlation matrixfig=plt.gcf()fig.set_size_inches(20,12)plt.show()

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

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

Машинно обучение с Python

Сега стигнахме до върха на урока: Моделиране на машинно обучение.

from sklearn.model_selection import train_test_split #for split the datafrom sklearn.metrics import accuracy_score #for accuracy_scorefrom sklearn.model_selection import KFold #for K-fold cross validationfrom sklearn.model_selection import cross_val_score #score evaluationfrom sklearn.model_selection import cross_val_predict #predictionfrom sklearn.metrics import confusion_matrix #for confusion matrixall_features = traindf.drop("Survived",axis=1)Targeted_feature = traindf["Survived"]X_train,X_test,y_train,y_test = train_test_split(all_features,Targeted_feature,test_size=0.3,random_state=42)X_train.shape,X_test.shape,y_train.shape,y_test.shape

Можете да изберете много алгоритми, включени в библиотеката на scikit-learn.

  1. Логистична регресия
  2. Случайна гора
  3. SVM
  4. K Най-близкият съсед
  5. Naive Bayes
  6. Decision Trees
  7. AdaBoost
  8. LDA
  9. Gradient Boosting

You might be overwhelmed trying to figure out what is what. Don’t worry, just treat is as a black box: choose one with the best performance. (I will create a whole article on these algorithms later.)

Let’s try it with my favorite one: the Random Forest Algorithm

from sklearn.ensemble import RandomForestClassifiermodel = RandomForestClassifier(criterion='gini', n_estimators=700, min_samples_split=10,min_samples_leaf=1, max_features="auto",oob_score=True, random_state=1,n_jobs=-1)model.fit(X_train,y_train)prediction_rm=model.predict(X_test)print('--------------The Accuracy of the model----------------------------')print('The accuracy of the Random Forest Classifier is', round(accuracy_score(prediction_rm,y_test)*100,2))kfold = KFold(n_splits=10, random_state=22) # k=10, split the data into 10 equal partsresult_rm=cross_val_score(model,all_features,Targeted_feature,cv=10,scoring='accuracy')print('The cross validated score for Random Forest Classifier is:',round(result_rm.mean()*100,2))y_pred = cross_val_predict(model,all_features,Targeted_feature,cv=10)sns.heatmap(confusion_matrix(Targeted_feature,y_pred),annot=True,fmt='3.0f',cmap="summer")plt.title('Confusion_matrix', y=1.05, size=15)

Wow! It gives us 83% accuracy. That’s good enough for our first time.

The cross validated score means a K Fold Validation method. If K = 10, it means you split the data in 10 variations and compute the mean of all scores as the final score.

Fine Tuning

Now you are done with the steps in Machine Learning with Python. But, there is one more step which can bring you better results: fine tuning. Fine tuning means finding the best parameter for Machine Learning Algorithms. If you see the code for random forest above:

model = RandomForestClassifier(criterion='gini', n_estimators=700, min_samples_split=10,min_samples_leaf=1, max_features="auto",oob_score=True, random_state=1,n_jobs=-1)

There are many parameters you need to set. These are the defaults, by the way. And you can change the parameters however you want. But of course, it will takes a lot of time.

Don’t worry — there is a tool called Grid Search, which finds the optimal parameters automatically. Sounds great, right?

# Random Forest Classifier Parameters tunning model = RandomForestClassifier()n_estim=range(100,1000,100)
## Search grid for optimal parametersparam_grid = {"n_estimators" :n_estim}
model_rf = GridSearchCV(model,param_grid = param_grid, cv=5, scoring="accuracy", n_jobs= 4, verbose = 1)
model_rf.fit(train_X,train_Y)
# Best scoreprint(model_rf.best_score_)
#best estimatormodel_rf.best_estimator_

Well, you can try it out for yourself. And have fun with Machine Learning.

Conclusion

How was it? It doesn’t seem very difficult does it? Machine Learning with Python is easy. Everything has been laid out for you. You can just do the magic. And bring happiness to people.

This piece was originally released on my blog at thedatamage.com