[Обзор и введение] Из содержания предыдущей главы вы можете почувствовать, что мы в основном разбираем базовые знания, чтобы вы могли понять некоторые операции анализа данных и в основном наблюдать за данными под разными углами. Итак, здесь мы в основном изучаем процесс анализа данных, в основном включая очистку данных и обработку характеристик данных, реконструкцию данных и визуализацию данных. Это содержание должно проложить путь к окончательному моделированию и оценке модели анализа данных.
Перед запуском импортируйте пакеты numpy, pandas и данные.
#加载所需的库
import numpy as np
import pandas as pd
#加载数据train.csv
data=pd.read_csv('train.csv')
data.head(20)
2 Глава 2: Очистка данных и обработка признаков
Данные, которые мы получаем, обычно нечисты.Так называемые нечистые означают, что в данных есть пропущенные значения, какие-то аномальные точки и т. д., и нам нужно пройти определенную обработку, прежде чем мы сможем продолжить последующий анализ или моделирование , Первый шаг — очистка данных.В этой главе мы изучим такие операции, как пропущенные значения, повторяющиеся значения, строки и преобразования данных, чтобы очистить данные во что-то, что можно анализировать или моделировать.
2.1 Наблюдение и обработка пропущенных значений
Данные, которые мы получаем, часто имеют много пропущенных значений. Например, мы можем видеть, что в столбце Cabin есть NaN. Есть ли пропущенные значения в других столбцах? Как быть с этими пропущенными значениями?
2.1.1 Задача 1: Наблюдение за недостающими значениями
- Смотрите количество пропущенных значений для каждой функции
- См. данные для столбцов «Возраст», «Кабина», «Посадка».
#写入代码
data.isnull().sum()
# temp = data.isnull().any() #列中是否存在空值
# print(temp)
#写入代码
data.info()
#写入代码
data[['Age','Cabin','Embarked']]
2.1.2 Задача 2. Обработка пропущенных значений
(1) Обычно существует несколько идей для работы с пропущенными значениями.
(2) Пожалуйста, попробуйте обработать недостающие значения данных столбца Возраст
(3) Пожалуйста, попробуйте использовать разные методы, чтобы напрямую работать с пропущенными значениями всей таблицы.
#写入代码
# data[data['Age']==None]=0 #不可行
data[data['Age'].isnull()] = 0 # 可行
# data[ddataf['Age'] == np.nan] = 0 #不可行
# data[data['Age'].isna()] = 0 #可行
data.head(20)
# data.isnull().sum()
#写入代码
data1=data.fillna(0)
data1.isnull().sum()
#写入代码
# 使用均值填充,计算均值时,分母默认不会加上NaN的值
'''
pandas (sum、mean、max、min、idxmax、idxmin、cumsum、mad、std、var、diff、pct_change、corr)这些函数会默认排除NaN值
通过指定 skipna=False ,可以使其包含 Nan
'''
# for column in list(data.columns[data.isnull().sum() > 0]):
# print(column)
# mean_val = data[column].mean()
# data[column].fillna(mean_val, inplace=True)
data1=data.fillna(data.mean())
data1.isnull().sum()
**[Размышление 1] Какие параметры есть у dropna и fillna и как их использовать? **
Общие идеи по работе с пропущенными значениями: Напоминание: доступны следующие функции ---> функция dropna и функция fillna.
При большой потере данных (меток, индикаторов и т. д.) в определенном столбце наш общий метод — удалить строку/столбец со слишком большим количеством нулевых значений, что обычно является эффективным методом. И обычно в pandas мы используем функцию dropna для выполнения этой операции.
Использованная литература:zhuanlan.zhihu.com/p/109366433
Конкретная функция:
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
Функциональная роль:
Удалить строки или столбцы с нулевыми значениями
Специальные параметры функции:
- ось: измерение, ось = 0 означает строку индекса, ось = 1 означает столбец столбцов, по умолчанию 0
- как: «все» означает, что все элементы в этой строке или столбце отсутствуют (нан) перед удалением этой строки или столбца, «любой» означает, что до тех пор, пока в этой строке или столбце отсутствуют элементы, эта строка или столбец удаляются
- thresh: На оси есть хотя бы thresh непропущенных значений, иначе удалить.
- подмножество: выберите столбцы с отсутствующими значениями в подмножестве определенных столбцов для удаления, а столбцы или строки с отсутствующими значениями, которых нет в подмножестве, не будут удалены (ось определяет, является ли это строкой или столбцом)
- на месте: выберите, следует ли сохранять новые данные с отсутствующими значениями в виде копии или изменять их непосредственно в исходных данных. По умолчанию установлено значение False, то есть для модификации создается новый объект, а исходный объект остается без изменений, что чем-то похоже на глубокое копирование и поверхностное копирование.
Пропущенные значения также можно заполнить с помощью функции fillna().
Использованная литература:zhuanlan.zhihu.com/p/109434512
Конкретная функция:
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
Роль функции: заполнить пропущенные значения
Специальные параметры функции:
- value: какое значение использовать для заполнения пропущенных значений
- ось: определяет измерение заполнения, начиная со строки или столбца
- метод: метод, используемый для заполнения пропущенных значений.
- limit: Определить количество заполнений.Если limit=2, будут заполнены только два пропущенных значения.
[Мышление] Для поиска вакансийnp.nan
,None
а также.isnull()
Что лучше и почему? Если один из способов не может найти пропущенные значения, то почему?
# np.nan()的一些奇妙性质:
np.nan == np.nan
>>> False
np.isnan(np.nan)
>>> True
np.nan is None
>>> False
type(np.nan)
>>> float
в заключении:
- np.nan не является «пустым» объектом, судя по i, None is False;
- Чтобы определить, является ли значение нулевым значением, вы можете использовать только функцию np.isnan(i) и никогда не использовать для этого i == np.nan(), потому что нулевое значение нельзя использовать для оценки равенства " ==" Правильная идентификация (первые два в приведенном выше примере);
- np.nan — это ненулевой объект, тип которого является базовым типом данных float.
Из приведенного выше видно, что и np.isnan(), и pd.isnull() могут выполнять обнаружение нулей в DataFrame, списке Python или только одном значении. Но обычно в практических приложениях np.isnan() в основном используется для проверки одного значения, а pd.isnull() используется для проверки DataFrame или Series (целого).
# 最终处理
# data.fillna(0,inplace=True)
# data.dropna(inplace=True)
# data.head(20)
# data.isnull().sum()
【Ссылаться на】pandas.друзья попали на него.org/pandas-docs…
【Ссылаться на】pandas.друзья попали на него.org/pandas-docs…
2.2 Повторное наблюдение и обработка значений
Будут ли по тем или иным причинам повторяться значения в данных, и если да, то что делать?
2.2.1 Задача 1: Проверить наличие повторяющихся значений в данных
#写入代码
data[data.duplicated()]
2.2.2 Задача 2. Обработка повторяющихся значений
(1) Как справиться с повторяющимися значениями?
(2) Обработка повторяющихся значений наших данных
#重复值有哪些处理方式:
#删除重复的数据
data.drop_duplicates(inplace=True) #删除所有列值相同的记录,index为2的记录行被删除
data.count()
2.2.3 Задача 3: Сохранить ранее очищенные данные в формате csv
#写入代码
data.to_csv('clear_train.csv')
2.3 Наблюдение и обработка признаков
Когда мы наблюдаем за функциями, мы можем грубо разделить их на две категории:
Числовые признаки: Survived, Pclass, Age, SibSp, Parch, Fare, где Survived, Pclass — дискретные числовые признаки, Age, SibSp, Parch, Fare — непрерывные числовые признаки
Текстовые функции: Имя, Пол, Каюта, Посадка, Билет, среди которых Пол, Каюта, Посадка, Билет являются категориальными текстовыми функциями, а числовые функции обычно могут использоваться непосредственно для обучения модели, но иногда для стабильности и надежности модели. Липкость дискретизирует непрерывные переменные. Текстовые функции часто необходимо преобразовать в числовые функции, прежде чем их можно будет использовать для анализа моделирования.
2.3.1 Задача 1: Биннинг (дискретизация) возраста
(1) Что такое операция биннинга?
(2) Непрерывная переменная Возраст поровну разделена на 5 возрастных групп и представлена категориальной переменной 12345 соответственно.
(3) Разделите непрерывную переменную Возраст на пять возрастных групп [0,5) [5,15) [15,30) [30,50) [50,80) и используйте категориальную переменную 12345 соответственно.
(4) Непрерывная переменная Возраст разделена на пять возрастных групп: 10%, 30%, 50%, 70%, 90% и представлена категориальной переменной 12345.
(5) Сохраните данные, полученные выше, отдельно и сохраните их в формате csv.
Что такое операция биннинга:Биннинг — это процесс преобразования непрерывных данных в категориальные аналоги. Например, непрерывные данные о росте делятся на: короткие, средние и высокие. Типичный пример: Наиболее распространена операция биннинга по возрасту. Предполагая, что возраст людей варьируется от 0 до 120 лет, мы рассматриваем 0–5 как младенцев, 6–15 лет как подростков, 16–30 лет как молодежь, 31–50 лет как людей среднего возраста и 50–60 лет как людей среднего возраста. люди среднего и пожилого возраста, а лица старше 60 лет считаются пожилыми. В этом процессе непрерывные возрасты делятся на шесть категорий: младенцы, подростки, молодежь, люди среднего возраста, среднего и пожилого возраста, а также пожилые люди, или делятся на шесть «коробок», каждая «коробка» представляет собой категорию.
Операция бинирования делится на эквидистантное бинирование и бинирование с равной частотой. pandas.cut и pandas.qcut, pandas.cut группирует непрерывные данные в соответствии с указанной точкой разграничения, pandas.qcut может указывать количество бинов для выполнения бинирования одинаковой ширины для непрерывных данных (примечание: так называемая равная ширина относится к каждый Количество данных в полях одинаковое)
прототип pandas.cut(x, bins, right=True, labels=None, retbins=False, точность=3, include_lowest=False, дубликаты='raise')
Значение параметра
- x: Сегментируемые массивы данных должны быть одномерными (нельзя использовать DataFrame);
- бины: бины — это вырезанные интервалы (или «сегменты», «блоки» и «панели»), которые имеют три формы: скаляр типа int, скалярная последовательность (массив) или pandas.IntervalIndex. Скаляр типа int.Когда bins является скаляром типа int, это означает, что x делится на бины. Диапазон x расширен на 0,1% с каждой стороны, чтобы включить максимальное и минимальное значения x. Последовательность скаляров Последовательность скаляров определяет ребро интервала каждого бина после разделения, и x в это время не расширяется. pandas.IntervalIndex, который определяет точный используемый интервал.
- right: логический параметр, значение по умолчанию — True, указывающее, следует ли включать правую часть интервала. Например, если bins=[1,2,3], right=True, то интервал равен (1,2], (2,3]; right=False, то интервал равен (1,2), (2 ,3).
- метки: маркируйте разделенные ячейки.Например, после разделения возраста x на возрастные ячейки вы можете пометить возрастные группы такими метками, как молодежь и средний возраст. Длина меток должна быть равна длине разделяемого интервала, например bins=[1,2,3], после деления 2 интервала (1,2], (2,3), длина меток должно быть 2. Если Specify labels=False, чтобы вернуть количество ячеек (начиная с 0), в которых находятся данные в x.
- retbins: параметр логического типа, указывающий, следует ли возвращать разделенные бины, он более полезен, когда bins является скаляром типа int, чтобы можно было получить разделенный интервал, по умолчанию — False.
- точность: количество знаков после запятой в зарезервированном интервале, по умолчанию 3.
- include_lowest: параметр логического типа, указывающий открыта или закрыта левая часть интервала, по умолчанию false, то есть левая часть интервала (закрытая) не включается.
- дубликаты: разрешать ли повторяющиеся интервалы. Есть два варианта: поднять: не разрешено, опустить: разрешено.
возвращаемое значение
- out: значение типа pandas.Categorical, Series или ndarray, представляющее, в какой ячейке (интервале) находится каждое значение в x после разделения.Если указаны метки, возвращается соответствующая метка.
- bins: разделенный интервал, возвращаемый, когда указанный retbins равен True
#写入代码
# 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
data['AgeBand']=pd.cut(data['Age'],5,labels=[1,2,3,4,5])
data.head(20)
# data.to_csv('train_ave.csv')
#写入代码
# 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
data['AgeBand']=pd.cut(data['Age'],[0,5,15,30,50,80],labels=[1,2,3,4,5])
data.head(20)
# data.to_csv('train_cut.csv')
#写入代码
#将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
data['AgeBand']=pd.qcut(data['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels=[1,2,3,4,5])
data.head(20)
# data.to_csv('train_pre.csv')
【Ссылаться на】pandas.друзья попали на него.org/pandas-docs…
【Ссылаться на】pandas.друзья попали на него.org/pandas-docs…
2.3.2 Задача 2: преобразовать текстовую переменную
(1) Просмотр имен и типов текстовых переменных
(2) Текстовые переменные Sex, Cabin, Embarked представлены числовой переменной 12345.
(3) Текстовые переменные Sex, Cabin, Embarked представлены однократным кодированием
# 写入代码
# 查看文本变量名及种类
# 方法1
# print(data['Sex'].value_counts())
# 方法2
print(data['Sex'].unique())
print(data['Sex'].nunique()) #有几种
# data['Cabin'].value_counts()
# data['Embarked'].value_counts()
#写入代码
# 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
#将类别文本转换为12345
#方法一: replace
data['Sex_num'] = data['Sex'].replace(['male','female'],[1,2])
data['Embarked_num']=data['Embarked'].replace(['S','C','Q'],[1,2,3])
# #方法二: map
# data['Sex_num'] = data['Sex'].map({'male': 1, 'female': 2})
# #方法三: 使用sklearn.preprocessing的LabelEncoder
# from sklearn.preprocessing import LabelEncoder
# for feat in ['Cabin', 'Ticket']:
# lbl = LabelEncoder()
# label_dict = dict(zip(data[feat].unique(), range(data[feat].nunique())))
# data[feat + "_labelEncode"] = data[feat].map(label_dict)
# data[feat + "_labelEncode"] = lbl.fit_transform(data[feat].astype(str))
data.head()
Для решения вышеуказанных проблем одним из возможных решений является использование One-Hot Encoding. Горячее кодирование - это однократное кодирование, также известное как однобитовое эффективное кодирование.Метод заключается в использовании N-битного регистра состояния для кодирования N состояний, каждое состояние имеет свой собственный независимый бит регистра, и в любое время только Один бит действителен.
Например:
Код естественного статуса: 000 001 010 011 100 101.
Горячее кодирование: 000001,000010,000100,001000,010000,100000
Таким образом можно понять, что для каждого признака, если он имеет m возможных значений, то после однократного кодирования он становится m бинарными признаками (например, признак оценок хороший, средний и плохой, и он становится одногорячий 100, 010, 001). Кроме того, эти функции являются взаимоисключающими и активируются только по одному разу. Таким образом, данные становятся разреженными.
Основными преимуществами этого являются:
- Решена проблема, связанная с тем, что классификатор плохо обрабатывает атрибутивные данные.
- В определенной степени это также играет роль расширения возможностей.
Преимущества и недостатки горячего кодирования
- Преимущества: Горячее кодирование решает проблему, заключающуюся в том, что классификатор плохо обрабатывает атрибутивные данные, а также в определенной степени играет роль расширения признаков. Его значения только 0 и 1, а разные типы хранятся в вертикальном пространстве.
- Недостаток: когда количество категорий велико, пространство признаков может стать очень большим. В этом случае для уменьшения размерности обычно можно использовать PCA. И комбинация одного горячего кодирования+PCA тоже очень полезна на практике.
Когда (не) использовать однократное кодирование?
- Использование: горячее кодирование используется для решения проблемы дискретных значений категориальных данных,
- Нет: функция горячего кодирования дискретных объектов состоит в том, чтобы сделать вычисление расстояния более разумным, но если объекты дискретны и расстояние можно разумно вычислить без одноразового кодирования, то нет необходимости выполнять однократное кодирование. кодирование. Некоторые древовидные алгоритмы не основаны на метриках векторного пространства при работе с переменными.Значение представляет собой только символ категории, то есть отношение частичного порядка отсутствует, поэтому однократное кодирование не требуется. Древовидная модель не требует однократного кодирования: для деревьев решений суть однократного кодирования заключается в увеличении глубины дерева.
В общем, если количество категорий одной горячей кодировки не слишком много, рекомендуется отдать приоритет.
#写入代码
# 将文本变量Sex, Cabin, Embarked用one-hot编码表示
#将类别文本转换为one-hot编码
'''
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)
该方法可以讲类别变量转换成新增的虚拟变量/指示变量。
常用参数
data : array-like, Series, or DataFrame. 输入的数据
prefix : string, list of strings, or dict of strings, default None. get_dummies转换后,列名的前缀
*columns : list-like, default None .指定需要实现类别转换的列名
dummy_na : bool, default False .增加一列表示空缺值,如果False就忽略空缺值
drop_first : bool, default False .获得k中的k-1个类别值,去除第一个
'''
#方法一: OneHotEncoder
for feat in ["Age", "Embarked"]:
# 先根据某一列的数据生成一个独热编码的DataFrame
x = pd.get_dummies(data[feat], prefix=feat)
# 使用concat函数将原来的data和x按column方向合并(横向拼接)
data = pd.concat([data, x], axis=1)
data.head()
2.3.3 Задача 3: Извлечение особенностей Заголовков из простого текста Имя (так называемые Заголовки — мистер, мисс, миссис и т. д.)
Я предлагаю взглянуть на регулярные выражения
#写入代码
data['Title'] = data.Name.str.extract('([A-Za-z]+)\.', expand=False)
data.head()
#保存最终你完成的已经清理好的数据
data.to_csv('train_fin.csv')