След един месец изучаване на Python, планирам да работя върху проекти, за да приложа знанията си. Kaggle е страхотна платформа, която провежда състезание за машинно обучение и предоставя набори от данни в реалния свят. Като първи опит прекарах общо 10 дни за този проект. Благодарение на онлайн ресурси като Stackoverflow и статии от Medium, които помагат много!

Индекс

  1. Заден план
  2. Проучвателен анализ на данни
  3. Импутиране на липсващи данни/извънредни стойности
  4. Трансформация на данни
  5. Създаване на функция
  6. Избор на функция
  7. Модел
  8. Подчинение

1. Предистория

Предизвикателството

Потъването на Титаник е едно от най-скандалните корабокрушения в историята.

На 15 април 1912 г., по време на първото си плаване, широко смятаният за "непотопяем" RMS Titanic потъва след сблъсък с айсберг. За съжаление нямаше достатъчно спасителни лодки за всички на борда, което доведе до смъртта на 1502 от 2224 пътници и екипаж.

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

В това предизвикателство ви молим да изградите предсказващ модел, който отговаря на въпроса: „какви хора са били по-склонни да оцелеят?“ използване на данни за пътниците (т.е. име, възраст, пол, социално-икономическа класа и т.н.).

Преглед

Данните са разделени на две групи:

  • комплект за обучение (train.csv)
  • набор от тестове (test.csv)

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

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

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

Речник на данни

VariableDefinitionKeysurvivalSurvival0 = Не, 1 = YespclassTicket class1 = 1-ви, 2 = 2-ри, 3 = 3rdsexSexAgeВъзраст в годиниsibsp# на братя и сестри / съпрузи на борда на Titanicparch# на родители / деца на борда на Titanicticket Номер на билета тарифаКабина на пътника Номер на кабината качено пристанище на качване, SC = Куинтаун = Шерсбург Саутхемптън

Променливи бележки

pclass: Прокси за социално-икономически статус (SES)
1-ви = Горен
2-ри = Среден
3-ти = Долен

възраст: Възрастта е дробна, ако е по-малка от 1. Ако възрастта е приблизителна, дали е под формата на xx.5

sibsp: Наборът от данни дефинира семейните отношения по този начин...
Брат/сестра = брат, сестра, доведеен брат, доведена сестра
Съпруг = съпруг, съпруга (любовниците и годениците бяха игнорирани)

parch: Наборът от данни определя семейните отношения по този начин...
Родител = майка, баща
Дете = дъщеря, син, доведена дъщеря, доведен син
Някои деца са пътували само с бавачка, следователно parch=0 за тях.

Цел

Ваша работа е да предвидите дали пътник е оцелял при потъването на Титаник или не.
За всеки от тестовия набор трябва да предвидите стойност 0 или 1 за променливата.

Метрика

Вашият резултат е процентът на пътниците, които правилно прогнозирате. Това е известно като „точност“.

2. Проучвателен анализ на данните

Импортиране на библиотеки:

import numpy as np
import os
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
from sklearn import metrics
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import RFECV
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.preprocessing import LabelEncoder
import warnings
warnings.filterwarnings(‘ignore’)

Импортиране на данни:

train_data = pd.read_csv(‘train.csv’)
test_data = pd.read_csv(‘test.csv’)

Структура на данни:

train_data.info()
Output:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
test_data.info()
Output:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 418 entries, 0 to 417
Data columns (total 13 columns):
Age            332 non-null float64
Cabin          91 non-null object
Embarked       418 non-null object
Fare           417 non-null float64
Name           418 non-null object
Parch          418 non-null int64
PassengerId    418 non-null int64
Pclass         418 non-null int64
Sex            418 non-null object
SibSp          418 non-null int64
Survived       0 non-null float64
Ticket         418 non-null object
Title          418 non-null object
dtypes: float64(3), int64(4), object(6)
memory usage: 45.7+ KB
  1. Общо бр. от редове: 891 за влак и 418 за набор от тестови данни.
  2. Кабина: липсват данни › 70% .
    Тъй като данните с по-малко от 30% не могат да предоставят значима информация, данните в кабината могат да бъдат игнорирани.
train_data.drop([‘Cabin’], axis=1, inplace=True)
test_data.drop([‘Cabin’], axis=1, inplace=True)

Оцеля

sns.countplot(train_data.Survived)
plt.show()

Обща вероятност за оцеляване ~38%

Pклас

sns.countplot(train_data.Pclass)
plt.show()

sns.barplot(x=’Pclass’, y=’Survived’, data=train_data)
plt.show()

1. Пътниците в Pclass 1 (горна класа) са по-склонни да оцелеят.

2. Pclass е добра функция за прогнозиране на оцеляването.

Секс

sns.countplot(train_data.Sex)
plt.show()

sns.barplot(x=’Sex’, y=’Survived’, data=train_data)
plt.show()

1. Съотношение на мъже и жени: ~2/3 срещу ~1/3

2. Мъжкият е много по-малко вероятно да оцелее, само с 20% шанс за оцеляване. За жени ›70% шанс за оцеляване.

3. Очевидно сексът е важна характеристика за предсказване на оцеляването.

Възраст

plt.hist(train_data.Age, edgecolor=’black’)
plt.xlabel('Age')
plt.ylabel('count')
plt.show()

sns.boxplot(x=’Survived’, y=’Age’, data=train_data)
plt.show()

1. Пътниците са предимно на възраст 20–40 години.

2. По-младите пътници са склонни да оцеляват.

SibSp

sns.countplot(train_data.SibSp)
plt.show()

sns.barplot(x=’SibSp’, y=’Survived’, data=train_data)
plt.show()

1. Повечето от пътниците пътуват с 1 брат/сестра/съпруг.

2. Пътниците, които имат 1 брат или сестра/съпруг, са по-склонни да оцелеят в сравнение с тези, които нямат.

3. За тези повече от 1 братя и сестри/съпрузи информацията не е достатъчна, за да предостави каквато и да е представа.

Парчи

sns.countplot(train_data.Parch)
plt.show()

sns.barplot(x=’Parch’, y=’Survived’, data=train_data)
plt.show()

1. ›70% пътници пътуват без родители/деца.

2. Пътниците, пътуващи с родители/деца, са по-склонни да оцелеят от тези, които не са.

Билет

train_data.Ticket.head(10)
Output:
0 A/5 21171
1 PC 17599
2 STON/O2. 3101282
3 113803
4 373450
5 330877
6 17463
7 349909
8 347742
9 237736
Name: Ticket, dtype: object

Цена

sns.distplot(train_data.Fare)
plt.show()

  1. Разпределението е дясно изкривено. Наблюдават се отклонения.
  2. За тези, които оцеляха, тарифите им са относително по-високи.

Качен

sns.countplot(train_data.Embarked)
plt.show()

sns.barplot(x=’Embarked’, y=’Survived’, data=train_data)
plt.show()

1. ›2/3 пътници се качиха на пристанище C.

2. Пътниците, качени на пристанище C, са по-склонни да оцелеят.

3. Импутиране на липсващи данни/ отклонения

Възраст

train_data.Name.head(10)
Output:
0 Braund, Mr. Owen Harris
1 Cumings, Mrs. John Bradley (Florence Briggs Th…
2 Heikkinen, Miss. Laina
3 Futrelle, Mrs. Jacques Heath (Lily May Peel)
4 Allen, Mr. William Henry
5 Moran, Mr. James
6 McCarthy, Mr. Timothy J
7 Palsson, Master. Gosta Leonard
8 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)
9 Nasser, Mrs. Nicholas (Adele Achem)
Name: Name, dtype: object

Нека извлечем титлите (г-н/г-жа/мис/майстор) от имената на пътниците. Това може да се направи както за обучаващи, така и за тестови набори от данни.

whole_data = train_data.append(test_data)
whole_data['Title'] = whole_data.Name.str.extract(r'([A-Za-z]+)\.', expand=False)
whole_data.Title.value_counts()
Output:
Mr          757
Miss        260
Mrs         197
Master       61
Dr            8
Rev           8
Col           4
Ms            2
Major         2
Mlle          2
Countess      1
Jonkheer      1
Don           1
Sir           1
Dona          1
Capt          1
Mme           1
Lady          1
Name: Title, dtype: int64

Обичайните титли са (г-н/мис/г-жа/майстор). Някои от заглавията (г-жа/дама/господин… и т.н.) могат да бъдат групирани в общите заглавия. Останалите некласифицирани заглавия могат да бъдат разделени на „Други“.

Common_Title = [‘Mr’, ‘Miss’, ‘Mrs’, ‘Master’]
whole_data[‘Title’].replace([‘Ms’, ‘Mlle’, ‘Mme’], ‘Miss’, inplace=True)
whole_data[‘Title’].replace([‘Lady’], ‘Mrs’, inplace=True)
whole_data[‘Title’].replace([‘Sir’, ‘Rev’], ‘Mr’, inplace=True)
whole_data[‘Title’][~whole_data.Title.isin(Common_Title)] = ‘Others’

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

train_data = whole_data[:len(train_data)]
test_data = whole_data[len(train_data):]
sns.boxplot(x='Title', y='Age', data=train_data)
plt.show()

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

AgeMedian_by_titles = train_data.groupby(‘Title’)[‘Age’].median()
AgeMedian_by_titles
Output:
Title
Master     3.5
Miss      21.5
Mr        30.0
Mrs       35.0
Others    47.0
Name: Age, dtype: float64

Приписване на липсващите стойности за възраст според заглавията.

for title in AgeMedian_by_titles.index:
    train_data['Age'][(train_data.Age.isnull()) & (train_data.Title == title)] = AgeMedian_by_titles[title]
    test_data['Age'][(test_data.Age.isnull()) & (test_data.Title == title)] = AgeMedian_by_titles[title]

Качен

За набор от данни за влака има само 2 липсващи стойности. Просто задайте режима.

train_data[‘Embarked’].fillna(train_data.Embarked.mode()[0], inplace=True)

Цена

За набор от тестови данни има само 1 липсваща стойност. Просто приписвайте медианата,

test_data[‘Fare’].fillna(test_data[‘Fare’].median(), inplace=True)

За набор от данни за влак има 3 извънредни стойности (т.е. 512.3292).

For train dataset, there are outliers observed. Replace them with median.
train_data.Fare.sort_values(ascending=False).head(5)
Output:
679 512.3292
258 512.3292
737 512.3292
341 263.0000
438 263.0000

Отклоненията трябва да се обработват, за да не се изкриви разпределението и по този начин да се направи моделът по-стабилен.

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

Избирам да заменя извънредните стойности с втората по-висока тарифа (т.е. 263).

train_data.loc[train_data.Fare>512, ‘Fare’] = 263
train_data.Fare.sort_values(ascending=False).head(5)
Output:
341    263.0
438    263.0
88     263.0
679    263.0
258    263.0
Name: Fare, dtype: float64

Проверете за липсващи данни.

train_data.info()
Output:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 891 entries, 0 to 890
Data columns (total 12 columns):
Age            891 non-null float64
Embarked       891 non-null object
Fare           891 non-null float64
Name           891 non-null object
Parch          891 non-null int64
PassengerId    891 non-null int64
Pclass         891 non-null int64
Sex            891 non-null object
SibSp          891 non-null int64
Survived       891 non-null float64
Ticket         891 non-null object
Title          891 non-null object
dtypes: float64(3), int64(4), object(5)
memory usage: 90.5+ KB
test_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 418 entries, 0 to 417
Data columns (total 12 columns):
Age            418 non-null float64
Embarked       418 non-null object
Fare           418 non-null float64
Name           418 non-null object
Parch          418 non-null int64
PassengerId    418 non-null int64
Pclass         418 non-null int64
Sex            418 non-null object
SibSp          418 non-null int64
Survived       0 non-null float64
Ticket         418 non-null object
Title          418 non-null object
dtypes: float64(3), int64(4), object(5)
memory usage: 42.5+ KB

4. Трансформация на данните

Кодирайте низ в числа за моделиране.

Секс

train_data[‘Sex_Code’] = train_data[‘Sex’].map({‘female’:1, ‘male’:0}).astype(‘int’)
test_data[‘Sex_Code’] = test_data[‘Sex’].map({‘female’:1, ‘male’:0}).astype(‘int’)

Качен

train_data['Embarked_Code'] = train_data['Embarked'].map({'S':0, 'C':1, 'Q':2}).astype('int')
test_data['Embarked_Code'] = test_data['Embarked'].map({'S':0, 'C':1, 'Q':2}).astype('int')

Групирайте данните в контейнери, за да направите модела по-стабилен и да избегнете прекомерно напасване.

Възраст

train_data['AgeBin_5'] = pd.qcut(train_data['Age'], 5)
test_data['AgeBin_5'] = pd.qcut(test_data['Age'], 5)
sns.barplot(x='AgeBin_5', y='Survived', data=train_data)
plt.show()

Цена

train_data[‘FareBin_5’] = pd.qcut(train_data[‘Fare’], 5)
test_data[‘FareBin_5’] = pd.qcut(test_data[‘Fare’], 5)

Кодирайте кошчетата за възраст и тарифа в числа за моделиране.

label = LabelEncoder()
train_data['AgeBin_Code_5'] = label.fit_transform(train_data['AgeBin_5'])
test_data['AgeBin_Code_5'] = label.fit_transform(test_data['AgeBin_5'])
label = LabelEncoder()
train_data[‘FareBin_Code_5’] = label.fit_transform(train_data[‘FareBin_5’])
test_data[‘FareBin_Code_5’] = label.fit_transform(test_data[‘FareBin_5’])

5. Създаване на функцията

Сам

SibSp и Parch са свързани с членове на семейството. просто заради това реших да ги комбинирам в една функция, а именно FamilySize.

train_data[‘FamilySize’] = train_data.SibSp + train_data.Parch + 1
test_data[‘FamilySize’] = test_data.SibSp + test_data.Parch + 1
sns.countplot(train_data.FamilySize)
plt.show()

Тъй като съотношението на FamilySize=1 е доминиращо, то може да не осигури достатъчна предсказваща сила. Реших да ги групирам и да се преобразувам да пътувам сам или не.

train_data[‘Alone’] = train_data.FamilySize.map(lambda x: 1 if x == 1 else 0)
test_data[‘Alone’] = test_data.FamilySize.map(lambda x: 1 if x == 1 else 0)
sns.countplot(train_data.Alone)
plt.show()

sns.barplot(x=’Alone’, y=’Survived’, data=train_data)
plt.show()

Наблюдава се, че ако пътувате сами, е по-малко вероятно да оцелеете (~30% срещу ~50%).

Заглавие

Заглавието е създадено за условните липсващи стойности на възрастта. Може да се използва и като нова функция.

sns.countplot(train_data.Title)
plt.show()

sns.barplot(x=’Title’, y=’Survived’, data=train_data)
plt.show()

Очевидно е, че титлата г-н е много по-малко вероятно да оцелее в сравнение с други.

Нека кодираме характеристиките за моделиране.

train_data[‘Title_Code’] = train_data.Title.map({‘Mr’:0, ‘Miss’:1, ‘Mrs’:2, ‘Master’:3, ‘Others’:4}).astype(‘int’)
test_data[‘Title_Code’] = test_data.Title.map({‘Mr’:0, ‘Miss’:1, ‘Mrs’:2, ‘Master’:3, ‘Others’:4}).astype(‘int’)

Свързано оцеляване

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

За да разберете семейните групи, освен фамилните имена на пасажите (може да има едни и същи фамилни имена, но различни семейства), нека разгледаме и билета.

train_data[[‘Name’, ‘Ticket’]].sort_values(‘Name’).head(20)
Output:
845                              Abbing, Mr. Anthony           C.A. 5547
746                      Abbott, Mr. Rossmore Edward           C.A. 2673
279                 Abbott, Mrs. Stanton (Rosa Hunt)           C.A. 2673
308                              Abelson, Mr. Samuel           P/PP 3381
874            Abelson, Mrs. Samuel (Hannah Wizosky)           P/PP 3381
365                   Adahl, Mr. Mauritz Nils Martin              C 7076
401                                  Adams, Mr. John              341826
40    Ahlin, Mrs. Johan (Johanna Persdotter Larsson)                7546
855                       Aks, Mrs. Sam (Leah Rosen)              392091
207                      Albimona, Mr. Nassef Cassem                2699
810                           Alexander, Mr. William                3474
840                      Alhomaki, Mr. Ilmari Rudolf    SOTON/O2 3101287
210                                   Ali, Mr. Ahmed  SOTON/O.Q. 3101311
784                                 Ali, Mr. William  SOTON/O.Q. 3101312
730                    Allen, Miss. Elisabeth Walton               24160
4                           Allen, Mr. William Henry              373450
305                   Allison, Master. Hudson Trevor              113781
297                     Allison, Miss. Helen Loraine              113781
498  Allison, Mrs. Hudson J C (Bessie Waldo Daniels)              113781
834                           Allum, Mr. Owen George                2223

Изглежда, че пътници с еднакви фамилни имена имат еднакви имена на билети.

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

whole_data = train_data.append(test_data)
whole_data['Surname'] = whole_data.Name.str.extract(r'([A-Za-z]+),', expand=False)
whole_data['TixPref'] = whole_data.Ticket.str.extract(r'(.*\d)', expand=False)
whole_data['SurTix'] = whole_data['Surname'] + whole_data['TixPref']
whole_data['IsFamily'] = whole_data.SurTix.duplicated(keep=False)*1
sns.countplot(whole_data.IsFamily)
plt.show()

Около 1/3 от пътниците пътуват със семейства.

След това нека изкопаем семействата с деца. Просто избройте онези „SurTix“, които са семейства и имат деца.

whole_data['Child'] = whole_data.Age.map(lambda x: 1 if x <=16 else 0)
FamilyWithChild = whole_data[(whole_data.IsFamily==1)&(whole_data.Child==1)]['SurTix'].unique()
len(UniqueFamilyTixWithChild)
Output:
66

Семействата с 1 или повече деца са 66.

Кодирайте всяко семейство с деца (т.е. задайте 0 за другите).

whole_data['FamilyId'] = 0
x = 1
for tix in UniqueFamilyTixWithChild:
 whole_data.loc[whole_data.SurTix==tix, ['FamilyId']] = x
 x += 1

нека да разгледаме данните за оцеляването на всяко семейство с деца

whole_data[‘SurvivedDemo’] = whole_data[‘Survived’].fillna(9)
pd.crosstab(whole_data.FamilyId, whole_data.SurvivedDemo).drop([0]).plot(kind=’bar’, stacked=True, color=[‘black’,’g’,’grey’])
plt.show()

Наблюдава се, че обикновено всички семейства са оцелели (т.е. всички зелени) или не са оцелели (т.е. всички черни). Това откритие доказва концепцията за свързаното оцеляване. За всяко семейство по-горе, ако има поне едно оцеляло, предполагаме, че и останалите могат да оцелеят.

whole_data[‘ConnectedSurvival’] = 0.5 
Survived_by_FamilyId = whole_data.groupby(‘FamilyId’).Survived.sum()
for i in range(1, len(UniqueFamilyTixWithChild)+1):
 if Survived_by_FamilyId[i] >= 1:
 whole_data.loc[whole_data.FamilyId==i, [‘ConnectedSurvival’]] = 1
 elif Survived_by_FamilyId[i] == 0:
 whole_data.loc[whole_data.FamilyId==i, [‘ConnectedSurvival’]] = 0
train_data = whole_data[:len(train_data)]
test_data = whole_data[len(train_data):]
sns.barplot(x='ConnectedSurvival', y='Survived', data=train_data)
plt.show()

Вероятността за оцеляване е много по-висока за пътниците, които:

  1. Пътуване с член на семейството
  2. Наличие на 1 или повече деца в семейството
  3. Наличието на 1 или повече оцелели в семейството

6. Избор на функцията

train_data.columns
Output:
Index(['Age', 'Embarked', 'Fare', 'Name', 'Parch', 'PassengerId', 'Pclass', 'Sex', 'SibSp', 'Survived', 'Ticket', 'Title', 'Sex_Code', 'AgeBin_5', 'FareBin_5', 'AgeBin_Code_5', 'FareBin_Code_5', 'FamilySize', 'Alone', 'Title_Code', 'Surname', 'TixPref', 'SurTix', 'IsFamily', 'Child', 'FamilyId', 'ConnectedSurvival'],
dtype='object')

Първо изхвърлете тези неизползвани колони

X_train = train_data.drop([‘Age’, ‘Embarked’, ‘Fare’, ‘Name’, ‘Parch’, ‘PassengerId’, ‘Sex’, ‘SibSp’, ‘Survived’, ‘Ticket’, 'Title', ‘AgeBin_5’, ‘FareBin_5’, ‘FamilySize’, ‘Surname’, ‘TixPref’, ‘SurTix’, ‘IsFamily’, ‘Child’, ‘FamilyId’], axis=1)
y_train = train_data[‘Survived’]

Задайте модел като RandomForestClassifier.

model = RandomForestClassifier(n_estimators=200, random_state=2)

Нека да разгледаме важността на функцията.

model.fit(X_train,y_train)
importance = pd.DataFrame({‘feature’:X_train.columns, ‘importance’: np.round(model.feature_importances_,3)})
importance = importance.sort_values(‘importance’, ascending=False).set_index(‘feature’)
importance.plot(kind='bar', rot=0)
plt.show()

Изберете първите 5 важни функции за моделиране (т.е. Title_Code, Sex_Code, Connected_Survivial, Pclass и FareBin_Code_5). Винаги поддържайте минимален брой функции, за да избегнете прекомерно монтиране.

final = [‘Title_Code’, ‘Sex_Code’, ‘ConnectedSurvival’, ‘Pclass’, ‘FareBin_Code_5’]

7. Модела

Настройка на параметрите на модела.

grid_param = {
 ‘n_estimators’: [100, 200, 300],
 ‘criterion’:[‘gini’, ‘entropy’],
 ‘min_samples_split’: [2, 10, 20],
 ‘min_samples_leaf’: [1, 5],
 ‘bootstrap’: [True, False],
}
gd_sr = GridSearchCV(estimator=model,
 param_grid=grid_param,
 scoring=’accuracy’,
 cv=5,
 n_jobs=-1)
gd_sr.fit(X_train[final], y_train)
best_parameters = gd_sr.best_params_
print(best_parameters)
Output:
{'bootstrap': True, 'criterion': 'entropy', 'min_samples_leaf': 5, 'min_samples_split': 2, 'n_estimators': 300}

Задайте параметрите на модела след настройката.

model = RandomForestClassifier(n_estimators=300, bootstrap=True, criterion= 'entropy', min_samples_leaf=5, min_samples_split=2, random_state=2)

Изчислете точността на прогнозата, като използвате 5-кратно кръстосано валидиране.

all_accuracies = cross_val_score(estimator=model1, X=X_train, y=y_train, cv=5)
all_accuracies
all_accuracies.mean()
Output:
[0.86592179 0.84357542 0.83707865 0.80898876 0.88700565]
0.8485140544303522

Средната точност е 0,8485

8. Подаването

X_test = test_data[final]
model.fit(X_train[final],y_train)
prediction = model.predict(X_test)
output = pd.DataFrame({‘PassengerId’: test_data.PassengerId, ‘Survived’: prediction.astype(int)})
output.to_csv(‘my_submission.csv’, index=False)

Резултатът на Kaggle е 0,82296 (Топ 3%)

Благодаря ти!