[Sklearn] Preprocesamiento de datos + ingeniería de funciones

Notas del tutorial de aprendizaje automático de Caicai

Proceso de minería de datos:

  1. recuperar datos
  2. Procesamiento previo de
    datos El procesamiento previo de datos es el proceso de detección, corrección o eliminación de registros dañados, inexactos o inadecuados de los datos.
    Los problemas que se pueden enfrentar son: diferentes tipos de datos, por ejemplo, algunos son texto, algunos son números y algunos contienen tiempo Secuencia, algunas continuas, otras discontinuas.
    También es posible que la calidad de los datos no sea buena, hay ruido, hay anomalías, faltan, los datos son incorrectos, las dimensiones son diferentes, hay duplicación, los datos están sesgados, la cantidad de datos es demasiado
    grande o demasiado pequeña
    . El propósito del preprocesamiento de datos: adaptar los datos al modelo , A juego con las necesidades del modelo
  3. Ingeniería de características La ingeniería de
    características es el proceso de transformar datos originales en características que representan mejor los problemas potenciales del modelo predictivo. Se puede lograr seleccionando las características más relevantes, extrayendo
    características y creando características. Entre ellos, la creación de características se implementa a menudo mediante algoritmos de reducción de dimensionalidad.
    Los problemas que se pueden enfrentar son: existen correlaciones entre las características, las características no están relacionadas con la etiqueta, las características son demasiadas o demasiado pequeñas, o simplemente no pueden mostrar el
    fenómeno de datos adecuado o no pueden mostrar la apariencia real de los datos.
    El propósito del proyecto de características: 1) Reducir el costo computacional, 2) Aumentar el límite superior del modelo
  4. Modele, pruebe el modelo y prediga el resultado
  5. Conéctese para verificar el efecto del modelo

1. Procesamiento previo de datos Procesamiento previo e imputación

1.1 Datos adimensionales

En la práctica de los algoritmos de aprendizaje automático, a menudo tenemos la necesidad de convertir datos de diferentes especificaciones a la misma especificación, o datos de diferentes distribuciones a una distribución específica. Este requisito se conoce colectivamente como datos " adimensionales ".

Preprocesamiento de normalización de datos.MinMaxScaler

Cuando los datos (x) se centran de acuerdo con el valor mínimo, y luego se escalan por el rango (valor máximo-valor mínimo), los datos se mueven por la unidad de valor mínimo y convergerán entre [0,1], y este proceso, Se denomina normalización de datos (normalización, también conocida como escala mínima-máxima). Tenga en cuenta que la normalización es normalización, no regularización. La verdadera regularización es la regularización, no un medio de preprocesamiento de datos. Los datos normalizados obedecen a una distribución normal, y la fórmula es la siguiente:
Inserte la descripción de la imagen aquí
En sklearn, usamos preprocessing.MinMaxScaler para lograr esta función. MinMaxScaler tiene un parámetro importante, feature_range, que controla el rango al que queremos comprimir los datos. El valor predeterminado es [0,1].

scaler = MinMaxScaler(feature_range=[5,10]) #实例化
result = scaler.fit_transform(data) #fit_transform一步导出结果
from sklearn.preprocessing import MinMaxScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
#不太熟悉numpy的小伙伴,能够判断data的结构吗?
#如果换成表是什么样子?
import pandas as pd
pd.DataFrame(data) #实现归一化
scaler = MinMaxScaler() #实例化
scaler = scaler.fit(data) #fit,在这里本质是生成min(x)和max(x)
result = scaler.transform(data) #通过接口导出结果
result
result_ = scaler.fit_transform(data) #训练和导出结果一步达成
scaler.inverse_transform(result) #将归一化后的结果逆转

#使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = MinMaxScaler(feature_range=[5,10]) #依然实例化
result = scaler.fit_transform(data) #fit_transform一步导出结果
result
#当X中的特征数量非常多的时候,fit会报错并表示,数据量太大了我计算不了
#此时使用partial_fit作为训练接口
#scaler = scaler.partial_fit(data)

Preprocesamiento de estandarización de datos.

Cuando los datos (x) están centrados por la media (μ) y luego escalados por la desviación estándar (σ), los datos obedecerán a una distribución normal con una media de 0 y una varianza de 1 (es decir, distribución normal estándar), y este proceso , Se llama estandarización de datos (estandarización, también conocida como normalización de puntaje Z), la fórmula es la siguiente:
Inserte la descripción de la imagen aquí

scaler = StandardScaler() #实例化
scaler.fit_transform(data) #使用fit_transform(data)一步达成结果
from sklearn.preprocessing import StandardScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = StandardScaler() #实例化
scaler.fit(data) #fit,本质是生成均值和方差
scaler.mean_ #查看均值的属性mean_
scaler.var_ #查看方差的属性var_
x_std = scaler.transform(data) #通过接口导出结果
x_std.mean() #导出的结果是一个数组,用mean()查看均值
x_std.std() #用std()查看方差
scaler.fit_transform(data) #使用fit_transform(data)一步达成结果
scaler.inverse_transform(x_std) #使用inverse_transform逆转标准化

Cuál elegir

Depende de la situación. En la mayoría de los algoritmos de aprendizaje automático, se seleccionará StandardScaler para el escalado de funciones, porque MinMaxScaler es muy sensible a los valores atípicos. Entre los algoritmos como PCA, agrupación en clústeres, regresión logística, máquinas de vectores de soporte y redes neuronales, StandardScaler suele ser la mejor opción .

MinMaxScaler se usa ampliamente cuando no implica medición de distancia, gradiente, cálculo de covarianza y los datos deben comprimirse a un intervalo específico . Por ejemplo , al cuantificar la intensidad de píxeles en el procesamiento de imágenes digitales, MinMaxScaler se usa para comprimir los datos en el intervalo [0,1].

Se recomienda probar primero StandardScaler, si el efecto no es bueno, cambie a MinMaxScaler.

1.2 valores perdidos

imputar.SimpleImputer

sklearn.impute.SimpleImputer(valores_faltantes = nan, estrategia = 'media', valor_lleno = Ninguno, detallado = 0, copia = Verdadero)
Inserte la descripción de la imagen aquí

data.info()
#填补年龄
Age = data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中特征矩阵必须是二维
Age[:20]
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer() #实例化,默认均值填补
imp_median = SimpleImputer(strategy="median") #用中位数填补
imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填补
imp_mean = imp_mean.fit_transform(Age) #fit_transform一步完成调取结果
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)
imp_mean[:20]
imp_median[:20]
imp_0[:20] #在这里我们使用中位数填补Age
data.loc[:,"Age"] = imp_median
data.info()
#使用众数填补Embarked
Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy = "most_frequent")
data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)
data.info()

Utilice numpy:

data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
#.fillna 在DataFrame里面直接进行填补
data.dropna(axis=0,inplace=True)
#.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
#参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False

1.3 Características del subtipo de procesamiento: codificación y variables ficticias

Codificación: convierta datos basados ​​en texto en datos numéricos

preprocessing.LabelEncoder: dedicado a las etiquetas, capaz de convertir la clasificación en valores de clasificación

(Etiqueta unidimensional)

from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])

preprocessing.OrdinalEncoder: función específica, puede convertir características categóricas en valores categóricos

(Matriz de características multidimensionales)

from sklearn.preprocessing import OrdinalEncoder
#接口categories_对应LabelEncoder的接口classes_,一模一样的功能
data_ = data.copy()
data_.head()
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
data_.head()

preprocessing.OneHotEncoder: codificación One-hot, creando variables ficticias

Es adecuado para variables nominales sin propiedades de cálculo, utilizando codificación one-hot para convertirlas en variables ficticias.
Inserte la descripción de la imagen aquí

data.head()
from sklearn.preprocessing import OneHotEncoder
X = data.iloc[:,1:-1]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()
result
#依然可以直接一步到位,但为了给大家展示模型属性,所以还是写成了三步
OneHotEncoder(categories='auto').fit_transform(X).toarray()
#依然可以还原
pd.DataFrame(enc.inverse_transform(result))
enc.get_feature_names()
result
result.shape
#axis=1,表示跨行进行合并,也就是将量表左右相连,如果是axis=0,就是将量表上下相连
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)
newdata.head()
newdata.drop(["Sex","Embarked"],axis=1,inplace=True)
newdata.columns = 
["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]

2. Ingeniería de funciones

Inserte la descripción de la imagen aquí

2.1 Método de filtrado

Inserte la descripción de la imagen aquí

2.1.1 Filtrado de varianza

Esto es para filtrar la clase de características por la variación de la característica en sí. Por ejemplo, si la varianza de una característica en sí es muy pequeña, significa que la muestra básicamente no tiene ninguna diferencia en esta característica. Es posible que la mayoría de los valores de la característica sean los mismos, o incluso que el valor de toda la característica sea el mismo, entonces esta característica no tiene ningún efecto en la diferenciación de la muestra. Entonces, no importa cuál sea el próximo proyecto de características, la característica con variación cero debe eliminarse primero . VarnceThreshold tiene un umbral de parámetro importante , que representa el umbral de varianza, lo que significa descartar todas las características con una varianza menor que el umbral. Si no se llena, el valor predeterminado es 0, lo que significa que se eliminan todos los registros con la misma característica.

from sklearn.feature_selection import Variancethreshold
selector = VarianceThreshold() #实例化,不填参数默认方差为0
X_var0 = selector.fit_transform(X) #获取删除不合格特征之后的新特征矩阵
#也可以直接写成 X = VairanceThreshold().fit_transform(X)

Se puede ver que hemos eliminado las características con una variación de 0, pero todavía hay más de 708 características, y es obvio que se necesita una mayor selección de características. Sin embargo, si sabemos cuántas funciones necesitamos, la variación también puede ayudarnos a seleccionar funciones en un solo paso. Por ejemplo, si queremos dejar la mitad de las características, podemos establecer un umbral de varianza que reduzca a la mitad el número total de características. Simplemente encuentre la mediana de la varianza de las características y luego
ingrese esta mediana como el valor del umbral del parámetro :

import numpy as np
X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X) X.var().values
np.median(X.var().values)
X_fsvar.shape

2.1.2 Filtrado por relevancia

Después de seleccionar la varianza, tenemos que considerar el siguiente tema: la correlación. Esperamos seleccionar características que sean relevantes y significativas para la etiqueta, porque tales características pueden proporcionarnos mucha información. Si la función no tiene nada que ver con la etiqueta, solo desperdiciará nuestra memoria computacional y también puede traer ruido al modelo. En sklearn, tenemos tres métodos de uso común para juzgar la correlación entre características y etiquetas: Chi-cuadrado, prueba F e información mutua .

2.1.2.1 Filtro chi-cuadrado

El filtrado de chi-cuadrado es un filtrado de relevancia específicamente para ** etiquetas discretas (es decir, problemas de clasificación) **.

from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#假设在这里我一直我需要300个特征
X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)
X_fschi.shape
Cómo elegir el valor de k: ver el valor de p y elegir k

La esencia de la prueba de chi-cuadrado es inferir la diferencia entre los dos conjuntos de datos. La hipótesis nula de la prueba es "los dos conjuntos de datos son independientes entre sí". La prueba de chi-cuadrado devuelve dos estadísticos, el valor de chi-cuadrado y el valor p. Entre ellos, el valor de chi-cuadrado es difícil de definir el rango efectivo, y para el valor p, generalmente usamos 0.01 o 0.05 como nivel de significancia, es decir, el límite del juicio del valor p.
Inserte la descripción de la imagen aquí
Desde la perspectiva de la ingeniería de características, esperamos seleccionar características con un gran valor de chi-cuadrado y un valor p menor que 0.05, es decir, la característica asociada con la etiqueta.
Antes de llamar a SelectKBest, podemos obtener directamente el valor de chi-cuadrado y el valor de P correspondientes a cada característica del modelo instanciado por chi2.

chivalue, pvalues_chi = chi2(X_fsvar,y)
chivalue
pvalues_chi
#k取多少?我们想要消除所有p值大于设定值,比如0.05或0.01的特征:
k = chivalue.shape[0] - (pvalues_chi > 0.05).sum()
#X_fschi = SelectKBest(chi2, k=填写具体的k).fit_transform(X_fsvar, y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

Se puede observar que el valor p de todas las características es 0, lo que significa que para el conjunto de datos del reconocedor de dígitos, la verificación de la varianza ha eliminado todas las características que no están relacionadas con la etiqueta, o el conjunto de datos en sí no contiene nada que no esté relacionado con la etiqueta. característica. En este caso, descartar cualquier característica descartará la información que sea útil para el modelo y reducirá el rendimiento del modelo, por lo que cuando estemos satisfechos con la velocidad de cálculo, no es necesario utilizar el filtrado de correlación para filtrar nuestros datos. Si creemos que la velocidad de cálculo es demasiado lenta, entonces podemos eliminar algunas características según corresponda, pero la premisa es que debemos sacrificar el rendimiento del modelo. A continuación, intentemos utilizar otros métodos de filtrado de correlación para verificar nuestras conclusiones sobre este conjunto de datos.

2.1.2.2F inspección

La prueba F, también conocida como ANOVA, prueba de homogeneidad de varianza, es un método de filtrado que se utiliza para capturar la relación lineal entre cada característica y la etiqueta . Puede realizar tanto regresión como clasificación, por lo que contiene feature_selection.f_classif (clasificación de prueba F) y feature_selection.f_regression (regresión de prueba F) dos clases. La clasificación de la prueba F se usa para los datos cuyas etiquetas son variables discretas y la regresión de la prueba F se usa para los datos cuyas etiquetas son variables continuas .

from sklearn.feature_selection import f_classif
F, pvalues_f = f_classif(X_fsvar,y) F
pvalues_f
k = F.shape[0] - (pvalues_f > 0.05).sum()
#X_fsF = SelectKBest(f_classif, k=填写具体的k).fit_transform(X_fsvar, y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fsF,y,cv=5).mean()

La conclusión obtenida es exactamente la misma que la obtenida mediante el filtrado de chi-cuadrado: ninguna característica tiene un valor p superior a 0,01, y todas las características están relacionadas con etiquetas, por lo que no necesitamos filtrado de correlación.

2.1.2.3 Información mutua

El método de información mutua es un método de filtrado que se utiliza para capturar cualquier relación ( incluida la relación lineal y no lineal ) entre cada característica y etiqueta . Y la prueba F es similar, puede hacer ambas clasificaciones de regresión y contiene dos clases feature_selection.mutual_info_classif (clasificación de información mutua) y
feature_selection.mutual_info_regression (devolución de información mutua). El uso y los parámetros de estas dos clases son exactamente los mismos que los de la prueba F, pero el método de información mutua es más poderoso que la prueba F. La prueba F solo puede encontrar relaciones lineales, mientras que el método de información mutua puede encontrar relaciones arbitrarias . El método de información mutua no devuelve estadísticas similares al valor p o al valor F. Devuelve "estimación de la cantidad de información mutua entre cada característica y objetivo". Este estimador toma un valor entre [0,1] y es 0. Indica que las dos variables son independientes y 1 significa que las dos variables están completamente correlacionadas. El código para la clasificación de información mutua como ejemplo es el siguiente:

from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(X_fsvar,y) k = result.shape[0] - sum(result <= 0)
#X_fsmic = SelectKBest(MIC, k=填写具体的k).fit_transform(X_fsvar, y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fsF,y,cv=5).mean()

Se estima que la información mutua de todas las características es mayor que 0, por lo que todas las características están relacionadas con las etiquetas.

2.2 Método de inclusión

El método de incrustación es un método que permite que el algoritmo decida qué características utilizar, es decir, la selección de características y el entrenamiento del algoritmo se realizan al mismo tiempo.
Inserte la descripción de la imagen aquí

2.3 Método de empaquetado con envoltura

El método de empaquetado también es un método de selección de características y entrenamiento de algoritmos al mismo tiempo. Es muy similar al método de incrustación. También se basa en la selección del algoritmo en sí, como coef_attribute o feature_importances_attribute para completar la selección de características. Pero la diferencia es que a menudo utilizamos una función objetivo como una caja negra para ayudarnos
a seleccionar características en lugar de ingresar un índice de evaluación o un umbral estadístico.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_45617555/article/details/112308688
Recomendado
Clasificación