Глава 3. Построение и оценка модели. Моделирование
Изучив пункты знаний в предыдущих двух главах, я могу обрабатывать сами цифровые данные, например добавлять, удалять, проверять и дополнять сами данные, а также выполнять необходимую работу по очистке. Затем мы собираемся начать использовать данные, которые мы обработали ранее. Что нам нужно сделать в этой главе, так это использовать данные.Цель нашего анализа данных состоит в том, чтобы использовать наши данные и объединить их с моим бизнесом, чтобы получить некоторые результаты, которые нам нужно знать. Тогда первым шагом анализа является моделирование, построение прогнозной модели или другой модели, после того, как мы получим результаты этой модели, мы должны проанализировать, достаточно ли надежна моя модель, затем мне нужно оценить эту модель.
У нас есть набор данных Титаника, поэтому наша цель на этот раз — выполнить задачу по прогнозированию выживания Титаника.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6) # 设置输出图片大小
Загружаем предоставленные нами данные после очистки (clear_data.csv), так же загружаем исходные данные (train.csv), и рассказываем об их отличиях
#写入代码
# 原始数据
data=pd.read_csv('train.csv')
data.head()
#写入代码
# 清洗数据
df=pd.read_csv('clear_data.csv')
df.head()
#写入代码
df.shape
# (891, 11)
Построение модели
- После обработки предыдущих данных мы получаем данные моделирования, и следующим шагом является выбор подходящей модели.
- Прежде чем приступить к выбору модели, нам нужно знать, что набор данных в конечном итогеконтролируемое обучениевсе ещенеконтролируемое обучение
- Выбор модели определяется с одной стороны нашей задачей.
- Помимо выбора модели исходя из нашей задачи, ее также можно определить исходя из размера выборки данных и разреженности признаков
- В начале мы всегда стараемся использовать базовую модель в качестве основы, а затем обучаем другие модели для сравнения и, наконец, выбираем модель с лучшей способностью к обобщению или производительностью.
Мое моделирование здесь заключается не в том, чтобы начать с нуля, завершить компиляцию всего кода самостоятельно. Здесь мы используем одну из наиболее часто используемых библиотек для машинного обучения (sklearn) для завершения построения нашей модели.
Путь выбора алгоритма sklearn приведен ниже для справки.
граф пути выбора алгоритма модели sklearn
【считать】Какие различия в наборе данных вызывают изменение модели при подгонке данных
думаю ответ
- Количество образцов
- Это проблема классификации
- Отмечены ли данные
- Параметр объекта данных
Задача 1: Разделить обучающий набор и тестовый набор
Здесь мы используем метод исключения, чтобы разделить набор данных.
- Разделите набор данных на независимые и зависимые переменные
- Разделите тренировочный набор и тестовый набор пропорционально (обычно доля тестового набора составляет 30%, 25%, 20%, 15% и 10%)
- Используйте стратифицированную выборку
- Установите случайное начальное число, чтобы результаты были воспроизводимыми
Какими способами можно разделить набор данных?
Удержание, перекрестная проверка, начальная загрузка
对于数据量充足的时候,通常采用 留出法 或者 k折交叉验证法 来进行训练/测试集的划分;
对于数据集小且难以有效划分训练/测试集时使用 自助法;
对于数据集小且可有效划分的时候最好使用 留一法 来进行划分
Зачем использовать стратифицированную выборку и каковы ее преимущества?
(A) Когда совокупность имеет очевидную внутреннюю стратификацию, стратифицированная выборка может преодолеть недостатки простой случайной выборки. Поскольку он основан на характерном распределении совокупности, количество выборок, полученных из разных слоев, максимально сбалансировано, чтобы выборка была больше похожа на совокупность.
(B) Стратифицированная выборка может повысить точность, с которой выборка определяет совокупность.
(C) Удобно понимать некоторые конкретные категории, а также анализировать и сравнивать группы различных атрибутов.
(D) Упростить крупномасштабную выборку и упростить администрирование процесса обследования.
Совет 1
- Набор данных сокращен, чтобы позже можно было оценить способность модели к обобщению.
- Метод резки набора данных в sklearn
train_test_split
- Просмотр документации по функциям можно использовать в блокноте Jupyter.
train_test_split?
Вы можете увидеть после входа - Иерархические и случайные начальные значения ищутся в параметрах
Чтобы извлечь необходимые параметры для train_test_split() из clear_data.csv и train.csv В машинном обучении мы обычно разделяем необработанные данные пропорционально на «набор тестов» и «набор поездов», вызывая функцию train_test_split из sklearn.model_selection.
Простое использование выглядит следующим образом:
X_train,X_test, y_train, y_test =sklearn.model_selection.train_test_split(train_data,train_target,test_size=0.4, random_state=0,stratify=y_train)
-
train_data: образец набора функций, который нужно разделить
-
train_target: результат выборки, который нужно разделить
-
test_size: доля выборок, если это целое число, то это количество выборок
-
random_state: это начальное значение случайного числа. Начальное число случайных чисел: на самом деле это номер группы случайных чисел.Когда требуются повторные эксперименты, гарантированно будет получена одна и та же группа случайных чисел. Например, если вы каждый раз вводите 1, случайный массив, который вы получаете, будет таким же, когда другие параметры одинаковы. А вот заполнять 0 или не заполнять, каждый раз будет по разному.
-
стратификация заключается в сохранении распределения классов до разделения. Например, имеется 100 элементов данных, 80 из которых относятся к классу A, а 20 — к классу B. Если train_test_split(... test_size=0.25, stratify = y_all), то данные после разделения следующие:
- обучение: 75 данных, из которых 60 относятся к классу А и 15 относятся к классу В.
- тестирование: 25 данных, из которых 20 относятся к классу А и 5 относятся к классу В.
С параметром стратификации соотношение классов в обучающей выборке и тестовой выборке составляет A:B=4:1, что эквивалентно соотношению до разделения (80:20). Стратификация обычно используется в таких случаях, когда распределение классов несбалансировано.
Stratify=X — распределить в соответствии с пропорцией в X
Stratify=y — распределить в соответствии с пропорцией в y
Общая сводка настроек и типов каждого параметра выглядит следующим образом:
Описание основного параметра:
* массивы: могут быть списками, массивами numpy, разреженными матрицами scipy или фреймами данных pandas.
test_size: может быть float, integer или None, по умолчанию None
①Если это число с плавающей запятой, это означает процент набора тестов в общей выборке.
②Если это целое число, это означает количество тестовых образцов
③Если выбрано None, размер теста автоматически устанавливается равным 0,25.
train_size: может быть числом с плавающей запятой, целым числом или None, по умолчанию — None.
①Если это число с плавающей запятой, это означает процент тренировочного набора в общем количестве выборок.
②Если это целое число, оно указывает количество обучающих выборок.
③ Если выбрано None, train_size автоматически устанавливается равным 0,75.
random_state: может быть целым числом, экземпляром RandomState или None, по умолчанию — None.
①Если выбрано значение «Нет», данные, генерируемые каждый раз, являются случайными и могут отличаться
②Если это целое число, данные, генерируемые каждый раз, одинаковы.
расслоение: может быть массивным или None
①Если установлено значение «Нет», доля меток классов в разделенном тестовом наборе или обучающем наборе также является случайной.
②Если это не None, доля меток классов в разделенном наборе тестов или обучающем наборе совпадает с долей меток классов во входном массиве, который можно использовать для работы с несбалансированными наборами данных.
#写入代码
from sklearn.model_selection import train_test_split
#写入代码
# 一般先取出X和y后再切割,有些情况会使用到未切割的,这时候X和y就可以用,x是清洗好的数据,y是我们要预测的存活数据'Survived'
x=df
y=data['Survived']
#写入代码
x_train,x_test,y_train,y_test=train_test_split(x,y,stratify=y,test_size=0.3,random_state=0)
#写入代码
x_train.shape,x_test.shape
# x_train=891*0.7
# x_test=891*0.3
【считать】При каких обстоятельствах вам не нужно выбирать случайным образом при резке набора данных?
думаю ответПосле того, как сам набор данных был случайно обработан, или набор данных очень большой, внутренняя часть уже достаточно случайна.
Задача 2: Создание модели
- Создание модели классификации на основе линейной модели (логистическая регрессия)
- Создание моделей классификации на основе дерева (деревья решений, случайные леса)
- Используйте эти модели для обучения, соответственно, для набора результатов обучения и набора тестов.
- Просмотрите параметры модели и измените значения параметров, чтобы наблюдать за изменениями модели.
Совет 2
- Логистическая регрессия — это не модель регрессии, а модель классификации, которую не следует путать с
LinearRegression
затемнять - Случайный лес на самом деле представляет собой ансамбль деревьев решений, чтобы уменьшить переобучение деревьев решений.
- Модуль, в котором находится линейная модель,
sklearn.linear_model
- Модуль, в котором находится модель дерева,
sklearn.ensemble
#写入代码
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
#写入代码
# 默认参数逻辑回归模型
lr = LogisticRegression()
lr.fit(x_train, y_train)
#写入代码
# 查看训练集和测试集score值 作用:返回该次预测的系数R2 最好是1
print("Training set score: {:.2f}".format(lr.score(x_train, y_train)))
print("Testing set score: {:.2f}".format(lr.score(x_test, y_test)))
#写入代码
# 调整参数后的逻辑回归模型
# 参数参考:https://blog.csdn.net/jark_/article/details/78342644
lr2 = LogisticRegression(C=100) # C是正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数。像SVM一样,越小的数值表示越强的正则化。
lr2.fit(x_train, y_train)
print("Training set score: {:.2f}".format(lr2.score(x_train, y_train)))
print("Testing set score: {:.2f}".format(lr2.score(x_test, y_test)))
# 默认参数的随机森林分类模型
rfc = RandomForestClassifier()
rfc.fit(x_train, y_train)
print("Training set score: {:.2f}".format(rfc.score(x_train, y_train)))
print("Testing set score: {:.2f}".format(rfc.score(x_test, y_test)))
# 调整参数后的随机森林分类模型
rfc2 = RandomForestClassifier(n_estimators=100, max_depth=5)
# n_estimators : integer, optional (default=10) 整数,可选择(默认值为10)。森林里(决策)树的数目。
# max_depth : integer or None, optional (default=None) 整数或者无值,可选的(默认为None)(决策)树的最大深度。如果值为None,那么会扩展节点,直到所有的叶子是纯净的,或者直到所有叶子包含少于min_sample_split的样本。
rfc2.fit(x_train, y_train)
print("Training set score: {:.2f}".format(rfc2.score(x_train, y_train)))
print("Testing set score: {:.2f}".format(rfc2.score(x_test, y_test)))
Задача 3: Вывод результатов прогнозирования модели
- Предсказанные классификационные метки выходной модели
- Вывод предсказанных вероятностей для разных меток класса
Совет 3
- В sklearn есть общая контролируемая модель.
predict
может выводить предсказанные метки,predict_proba
Затем вы можете вывести вероятность метки
#写入代码
pre=lr.predict(x_train)
#写入代码
pre[:10]
#写入代码
pre_proda=lr.predict_proba(x_train)
#写入代码
pre_proda[:10]
【считать】Как нам помогает предсказание вероятности появления метки?
Вероятность предсказания метки позволяет судить о надежности метки, чем она ближе к 1, тем выше надежность.