предисловие
Эта статья основана на конкурсе Kaggle.TitanicНачали, ввели несколько методов разработки признаков и, наконец, обучили три модели (RF, GBDT, SVM) и использовали метод ансамбля (классификатор голосования) для прогнозирования.
Полный код и данные можно найти наReMachineLearning(titanic) - Githubполучено в
текст
Ниже приводится введение kaggle для этого соревнования.
The sinking of the RMS Titanic is one of the most infamous shipwrecks in history. On April 15, 1912, during her maiden voyage, the Titanic sank after colliding with an iceberg, killing 1502 out of 2224 passengers and crew. This sensational tragedy shocked the international community and led to better safety regulations for ships.
One of the reasons that the shipwreck led to such loss of life was that there were not enough lifeboats for the passengers and crew. Although there was some element of luck involved in surviving the sinking, some groups of people were more likely to survive than others, such as women, children, and the upper-class.
In this challenge, we ask you to complete the analysis of what sorts of people were likely to survive. In particular, we ask you to apply the tools of machine learning to predict which passengers survived the tragedy.
Проще говоря, это способ сделать вывод, выживет ли пассажир или нет, если известна всякая информация о пассажире.двухклассныйпроблема.
В этой статье сначала используются некоторые методы разработки признаков, а затемслучайный лес(Случайные леса),GBDT(Дерево принятия решений по повышению градиента) иSVM(Машина опорных векторов) в качестве модели обучения и, наконец, используетсяклассификатор голосованияАнсамбльный метод (Voting Classifier) создает модельный ансамбль.
Эта статья основана на Python 3, sklearn и Pandas (настоятельно рекомендуется следовать Anaconda), данные взяты из Kaggle, а код и данные можно найти вGithubпродолжать
структура данных
Сначала кратко представим структуру csv обучающих данных, приведенную ниже.
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S
4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S
- ID пассажира (ID)
- Выжил (выжил или нет)
- Pкласс (класс салона)
- Имя
- Секс
- Возраст
- Парч (количество детей с родительскими отношениями)
- SibSp (количество братьев и сестер)
- Билет (номер билета)
- Тариф (тариф)
- Каюта (номер каюты)
- Embarked (номер порта, где судно было взято на абордаж)
предварительная обработка данных
Sex
Из данных видно, чтоПол(Пол) — это строка перечисленияmale
илиfemale
, чтобы компьютер лучше обрабатывал этот столбец данных, мы будемЧисленная обработка
# API文档 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.map.html
# map方法数字化处理并改变pandas的列类型
df['Sex'] = df['Sex'].map({'female': 1, 'male': 0}).astype(int)
завершение данных
использоватьdf.info()
Легко определить, какой тип данных является неполным
<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 int64
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(6), object(4)
memory usage: 83.6+ KB
Можно обнаружить, что информация о возрасте, каюте и посадке неполная, поэтому нам нужно заполнить их. Для теоретического изучения того, как машинное обучение обрабатывает недостающие данные, вы можете обратиться ксодержание по ссылке.
Мое решение в этом примере:
- Пропущенные значения для возраста были заполнены медианой. На самом деле, другой разумный подход состоит в том, чтобы построить модель для использования данных для «предсказания» отсутствующих данных. Например, Age на самом деле имеет определенную связь с Fare и Pclass.
Парч и Сибсп
Sibsp
Относится к братьям и сестрам или супругам, которые вместе плывут на лодке,Parch
Относится к родителям или детям, которые вместе плывут в лодке.
Добавьте столбец familysize как сумму sibsp и parch, представляющую общее количество членов семьи. Этот метод извлечения скрытых атрибутов или комбинаций атрибутов из необработанных данных называется производными атрибутами. Но у этих добытых функций есть несколько проблем:
- Эти особенности обладают мультиколлинеарностью, что может привести к пространственной нестабильности;
- Само многомерное пространство является разреженным, и 68% значений в одномерном нормальном распределении попадают между положительным и отрицательным стандартными отклонениями, в то время как в десятимерном пространстве только 0,02%;
- Слишком много атрибутов увеличит количество вычислений. Поэтому используется технология редукции данных (уменьшение размерности), и уменьшенный набор данных получается намного меньше, но в основном сохраняется целостность исходных данных.
На самом деле, я не понимаю, почему Sibsp и Parch должны быть добавлены сюда как Familysize, и я не могу объяснить рациональность этого.
Fare
Fare
относится к тарифу
Исследование и анализ данных
После получения данных первое, что нам нужно сделать, это проанализировать данные и характеристики.
Корреляции признаков
pandas может вычислить значение данных с помощью метода corr DataFrameКоэффициент корреляции(Есть три метода: Пирсона, Кендалла, Спирмена), которые здесь не раскрываются, тем не менее корреляцию между данными можно рассчитать.
# API文档 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.corr.html
def plot_corr(df,size=10):
'''Function plots a graphical correlation matrix for each pair of columns in the dataframe.
Input:
df: pandas DataFrame
size: vertical and horizontal size of the plot'''
corr = df.corr()
fig, ax = plt.subplots(figsize=(size, size))
ax.matshow(corr)
for (i, j), z in np.ndenumerate(corr):
ax.text(j, i, '{:.2f}'.format(z), ha='center', va='center')
plt.xticks(range(len(corr.columns)), corr.columns)
plt.yticks(range(len(corr.columns)), corr.columns)
# 特征相关性图表
plot_corr(df)
можно увидетьSurvived(Survival) имеет относительно большую связь с Pclass, Sex и Fare и почти не имеет ничего общего с PassengerId. Таким образом, мы можем удалить PassengerId.
Модель
Я также упоминал ранее, что мы будем использовать три модели и метод интегрирования, здесь нечего останавливаться.
использовалслучайный лес(Случайные леса),GBDT(Дерево принятия решений по повышению градиента) иSVM(Машина опорных векторов) в качестве модели обучения и, наконец, используетсяклассификатор голосования(Классификатор голосования) метод ансамбля делает ансамбль модели
результат
Результаты с использованием голосования и одной модели следующие:
постскриптум
Для каждого алгоритма, задействованного в этом посте в блоге, я позже напишу отдельный пост в блоге (сначала яму выкопаю), этот блог пишется уже почти 2 месяца =, =, и я остановил его один раз на середине. .
использованная литература
От дерева решений к случайному лесу: принцип и реализация древовидного алгоритма
Титаник: машинное обучение после катастрофы
Начало работы с Kaggle 1.3 — титаническое решение с использованием speedml