«Анализ данных Pandas» (2) — очистка данных и обработка признаков

анализ данных
«Анализ данных Pandas» (2) — очистка данных и обработка признаков

[Обзор и введение] Из содержания предыдущей главы вы можете почувствовать, что мы в основном разбираем базовые знания, чтобы вы могли понять некоторые операции анализа данных и в основном наблюдать за данными под разными углами. Итак, здесь мы в основном изучаем процесс анализа данных, в основном включая очистку данных и обработку характеристик данных, реконструкцию данных и визуализацию данных. Это содержание должно проложить путь к окончательному моделированию и оценке модели анализа данных.

Перед запуском импортируйте пакеты numpy, pandas и данные.

#加载所需的库
import numpy as np
import pandas as pd
#加载数据train.csv
data=pd.read_csv('train.csv')
data.head(20)

image.png

2 Глава 2: Очистка данных и обработка признаков

Данные, которые мы получаем, обычно нечисты.Так называемые нечистые означают, что в данных есть пропущенные значения, какие-то аномальные точки и т. д., и нам нужно пройти определенную обработку, прежде чем мы сможем продолжить последующий анализ или моделирование , Первый шаг — очистка данных.В этой главе мы изучим такие операции, как пропущенные значения, повторяющиеся значения, строки и преобразования данных, чтобы очистить данные во что-то, что можно анализировать или моделировать.

2.1 Наблюдение и обработка пропущенных значений

Данные, которые мы получаем, часто имеют много пропущенных значений. Например, мы можем видеть, что в столбце Cabin есть NaN. Есть ли пропущенные значения в других столбцах? Как быть с этими пропущенными значениями?

2.1.1 Задача 1: Наблюдение за недостающими значениями

  1. Смотрите количество пропущенных значений для каждой функции
  2. См. данные для столбцов «Возраст», «Кабина», «Посадка».
#写入代码
data.isnull().sum()
# temp = data.isnull().any() #列中是否存在空值
# print(temp)

image.png

#写入代码
data.info()

image.png

#写入代码

data[['Age','Cabin','Embarked']]

image.png

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()

image.png

#写入代码

data1=data.fillna(0)
data1.isnull().sum()

image.png

#写入代码
# 使用均值填充,计算均值时,分母默认不会加上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()

image.png

**[Размышление 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

в заключении:

  1. np.nan не является «пустым» объектом, судя по i, None is False;
  2. Чтобы определить, является ли значение нулевым значением, вы можете использовать только функцию np.isnan(i) и никогда не использовать для этого i == np.nan(), потому что нулевое значение нельзя использовать для оценки равенства " ==" Правильная идентификация (первые два в приведенном выше примере);
  3. 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()]

image.png

2.2.2 Задача 2. Обработка повторяющихся значений

(1) Как справиться с повторяющимися значениями?

(2) Обработка повторяющихся значений наших данных

#重复值有哪些处理方式:
#删除重复的数据

data.drop_duplicates(inplace=True) #删除所有列值相同的记录,index为2的记录行被删除
data.count()

image.png

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')

image.png

#写入代码
# 将连续变量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')

image.png

#写入代码
#将连续变量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')

image.png【Ссылаться на】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()

image.png

#写入代码
# 将文本变量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()

image.png

Для решения вышеуказанных проблем одним из возможных решений является использование 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()

image.png

2.3.3 Задача 3: Извлечение особенностей Заголовков из простого текста Имя (так называемые Заголовки — мистер, мисс, миссис и т. д.)

Я предлагаю взглянуть на регулярные выражения

#写入代码
data['Title'] = data.Name.str.extract('([A-Za-z]+)\.', expand=False)
data.head()

image.png

#保存最终你完成的已经清理好的数据
data.to_csv('train_fin.csv')