[Sklearn] 데이터 전처리 + 기능 엔지니어링

Caicai의 기계 학습 튜토리얼 노트

데이터 마이닝 프로세스 :

  1. 데이터 검색
  2. 데이터 사전 처리
    데이터 사전 처리는 데이터에서 손상되었거나 부정확하거나 부적합한 레코드를 감지, 수정 또는 삭제하는 프로세스입니다.
    직면 할 수있는 문제는 다음과 같습니다. 다른 데이터 유형 (예 : 일부는 텍스트, 일부는 숫자, 일부는 시간 포함) 시퀀스, 일부 연속, 일부 불연속.
    데이터의 품질이 좋지 않거나, 잡음이 있고, 이상이
    있거나 , 누락이 있거나 , 데이터가 잘못되었거나, 차원이 다르거 나, 중복이 있거나 , 데이터가 왜곡 되거나 , 데이터 양이 너무 크거나, 너무 적을 수도 있습니다
    . 데이터 전처리의 목적 : 데이터를 모델에 맞게 조정하는 것입니다. , 모델의 요구에 부합
  3. 기능 엔지니어링
    기능 엔지니어링은 원본 데이터를 예측 모델의 잠재적 문제를 더 잘 나타내는 기능으로 변환하는 프로세스로, 가장 관련성이 높은 기능을 선택하고, 기능을 추출
    하고, 기능을 생성 하여 수행 할 수 있습니다 . 그중에서 특징 생성은 종종 차원 감소 알고리즘을 통해 구현됩니다.
    직면 할 수있는 문제는 기능간에 상관 관계가 있고, 기능이 레이블과 관련이 없거나, 기능이 너무 많거나 작거나, 적절한
    데이터 현상을 보여주지 못하거나, 데이터의 실제 모습을 보여줄 수 없다는
    것입니다. 기능 프로젝트의 목적 : 1) 계산 비용 감소, 2) 모델 상한 증가
  4. 모델링, 모델 테스트 및 결과 예측
  5. 모델 효과를 확인하려면 온라인으로 이동하십시오.

1. 데이터 전처리 전처리 및 대치

1.1 무 차원 데이터

기계 학습 알고리즘의 실행에서 우리는 종종 서로 다른 사양의 데이터를 동일한 사양으로 변환하거나 서로 다른 분포의 데이터를 특정 분포로 변환해야합니다.이 요구 사항을 통칭하여 " 무 차원 " 데이터 라고 합니다 .

데이터 정규화 전처리.

데이터 (x)가 최소값에 따라 중앙에 배치 된 다음 범위 (최대 값-최소값)로 스케일링되면 데이터가 최소값 단위로 이동하고 [0,1] 사이로 수렴됩니다. 이를 데이터 정규화 (Normalization, Min-Max Scaling이라고도 함)라고합니다. 정규화는 정규화가 아니라 정규화입니다. 실제 정규화는 데이터 전처리 수단이 아니라 정규화입니다. 정규화 된 데이터는 정규 분포를 따르며 공식은 다음과 같습니다
여기에 사진 설명 삽입
. sklearn에서이 함수를 달성하기 위해 preprocessing.MinMaxScaler를 사용합니다. MinMaxScaler에는 데이터를 압축 할 범위를 제어하는 ​​중요한 매개 변수 인 feature_range가 있으며 기본값은 [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)

데이터 표준화 전처리 .StandardScaler

데이터 (x)가 평균 (μ)의 중심에 놓인 다음 표준 편차 (σ)로 스케일링되면 데이터는 평균이 0이고 분산이 1 인 정규 분포 (즉, 표준 정규 분포)를 따르며이 과정은 , 데이터 표준화 (표준화, Z 점수 정규화라고도 함)라고하며 공식은 다음과 같습니다.
여기에 사진 설명 삽입

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逆转标准化

선택할 것

상황에 따라 다릅니다. 대부분의 기계 학습 알고리즘에서 MinMaxScaler는 이상 값에 매우 민감하기 때문에 기능 확장을 위해 StandardScaler가 선택됩니다. PCA, 클러스터링, 로지스틱 회귀, 지원 벡터 머신 및 신경망의 알고리즘 중에서 StandardScaler가 종종 최선의 선택 입니다.

MinMaxScaler는 거리 측정, 기울기, 공분산 계산을 포함하지 않고 데이터를 특정 간격으로 압축 해야 할 때 널리 사용 됩니다 . 예를 들어 디지털 이미지 처리 에서 픽셀 강도양자화 할 때 MinMaxScaler는 간격 [0,1]에서 데이터를 압축하는 데 사용됩니다.

먼저 StandardScaler를 시도하고 효과가 좋지 않으면 MinMaxScaler로 변경하는 것이 좋습니다.

1.2 결 측값

impute.SimpleImputer

sklearn.impute.SimpleImputer(missing_values ​​= nan, 전략 = 'mean', fill_value = None, verbose = 0, copy = True)
여기에 사진 설명 삽입

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

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 처리 하위 유형 특성 : 코딩 및 더미 변수

인코딩 : 텍스트 기반 데이터를 숫자 데이터로 변환

preprocessing.LabelEncoder : 라벨 전용, 분류를 분류 값으로 변환 할 수 있음

(1 차원 라벨)

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

preprocessing.OrdinalEncoder : 기능별, 범주 형 기능을 범주 형 값으로 변환 할 수 있습니다.

(다차원 특성 매트릭스)

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

전처리 .OneHotEncoder : 원-핫 인코딩, 더미 변수 생성

원-핫 인코딩을 사용하여 더미 변수로 변환하는 계산 속성이없는 명목 변수에 적합합니다.
여기에 사진 설명 삽입

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. 기능 엔지니어링

여기에 사진 설명 삽입

2.1 필터 방식

여기에 사진 설명 삽입

2.1.1 분산 필터링

이는 기능 자체의 분산으로 기능 클래스를 필터링하기위한 것입니다. 예를 들어, 특성 자체의 분산이 매우 작다면 샘플이 기본적으로이 특성에 차이가 없음을 의미합니다. 특성에있는 대부분의 값이 동일하거나 전체 특성의 값이 동일하더라도이 특성은 샘플 차별화에 영향을 미치지 않습니다. 따라서 다음 기능 프로젝트가 무엇을 할 것인지에 관계없이 분산이 0 인 기능을 먼저 제거 해야합니다 . VarianceThreshold에는 분산 임계 값 을 나타내는 중요한 매개 변수 threshold가 있습니다 . 이는 분산이 임계 값보다 작은 모든 특성을 삭제함을 의미합니다. 값이 채워지지 않은 경우 기본값은 0이며 동일한 특성을 가진 모든 레코드가 삭제됨을 의미합니다.

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

분산이 0 인 기능을 삭제했지만 여전히 708 개 이상의 기능이 있으며 추가 기능 선택이 필요하다는 것을 알 수 있습니다. 그러나 필요한 기능의 수를 알고 있다면 분산도 한 단계에서 기능을 선택하는 데 도움이 될 수 있습니다. 예를 들어, 특성의 절반을 유지하려는 경우 전체 특성 수를 절반으로 줄이는 분산 임계 값을 설정할 수 있습니다. 특성 분산의 중앙값을 찾은 다음이 중앙값을 매개 변수
임계 값 으로 입력 하면됩니다 .

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 관련성 필터링

분산을 선택한 후 다음 문제인 상관 관계를 고려해야합니다. 이러한 기능은 많은 정보를 제공 할 수 있으므로 레이블과 관련이 있고 의미있는 기능을 선택하려고합니다. 기능이 레이블과 관련이없는 경우 계산 메모리 만 낭비하고 모델에 노이즈를 가져올 수도 있습니다. sklearn에는 기능과 레이블 간의 상관 관계를 판단하기 위해 일반적으로 사용되는 세 가지 방법 인 카이-제곱, F- 검정 및 상호 정보가 있습니다.

2.1.2.1 카이 제곱 필터

카이 제곱 필터링은 특히 ** 이산 태그 (즉, 분류 문제) **에 대한 관련성 필터링입니다.

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
k 값을 선택하는 방법 -p 값 참조 및 k 선택

카이-제곱 검정의 핵심은 두 데이터 집합 간의 차이를 추론하는 것입니다. 검정의 귀무 가설은 "두 데이터 집합이 서로 독립적입니다." 카이 제곱 검정은 카이 제곱 값과 p- 값의 두 가지 통계를 반환합니다.이 중 카이-제곱 값은 유효 범위를 정의하기 어렵고 p- 값은 일반적으로 p- 값 판단의 경계인 유의 수준으로 0.01 또는 0.05를 사용합니다.
여기에 사진 설명 삽입
특성 엔지니어링의 관점에서 카이-제곱 값이 크고 p- 값이 0.05 미만인 특성 즉, 레이블과 관련된 특성을 선택하려고합니다.
SelectKBest를 호출 하기 전에 chi2로 인스턴스화 된 모델에서 각 특성에 해당하는 카이 제곱 값과 P 값을 직접 얻을 수 있습니다.

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

모든 특성의 p 값이 0이라는 것을 알 수 있습니다. 즉, 숫자 인식기의 데이터 세트에 대해 분산 검증이 레이블과 관련이없는 모든 특성을 제거했거나 데이터 세트 자체에 레이블과 관련이없는 항목이 포함되어 있지 않음을 의미합니다. 특색. 이 경우 기능을 폐기하면 모델에 유용한 정보가 폐기되고 모델의 성능이 저하되므로 계산 속도에 만족하면 상관 관계 필터링을 사용하여 데이터를 필터링 할 필요가 없습니다. 계산 속도가 너무 느리다고 생각되면 적절하게 일부 기능을 삭제할 수 있지만 전제는 모델의 성능을 희생해야한다는 것입니다. 다음으로이 데이터 세트에 대한 결론을 확인하기 위해 다른 상관 필터링 방법을 사용해 보겠습니다.

2.1.2.2F 검사

분산의 동질성 테스트 인 ANOVA라고도하는 F 테스트 는 각 특성과 레이블 간의 선형 관계 를 캡처 하는 데 사용되는 필터링 방법 입니다 . 회귀와 분류를 모두 수행 할 수 있으므로 feature_selection.f_classif (F 테스트 분류) 및 feature_selection.f_regression (F 테스트 회귀) 두 클래스를 포함합니다. F- 검정 분류는 레이블이 이산 변수 인 데이터에 사용 되며 F- 검정 회귀는 레이블이 연속 변수 인 데이터에 사용됩니다 .

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

얻은 결론은 카이-제곱 필터링으로 얻은 결과와 정확히 동일합니다. 0.01보다 큰 p- 값을 갖는 기능은없고 모든 기능이 레이블과 관련되어 있으므로 상관 필터링이 필요하지 않습니다.

2.1.2.3 상호 정보

상호 정보 방법은 각 기능과 레이블 간의 모든 관계 ( 선형 및 비선형 관계 포함) 를 캡처하는 데 사용되는 필터링 방법 입니다 . 그리고 F 테스트는 유사하며 회귀 분류를 수행 할 수 있으며 feature_selection.mutual_info_classif (상호 정보 분류) 및
feature_selection.mutual_info_regression (상호 정보 반환) 두 클래스를 포함 합니다. 이 두 클래스의 사용법과 매개 변수는 F 검정과 정확히 동일하지만 상호 정보 방법이 F 검정보다 강력하며 F 검정은 선형 관계 만 찾을 수 있고 상호 정보 방법은 임의의 관계를 찾을 수 있습니다 . 상호 정보 방법은 p- 값 또는 F- 값과 유사한 통계를 반환하지 않습니다. "각 특성과 대상 간의 상호 정보 양 추정"을 반환합니다.이 추정기는 [0,1] 사이의 값을 사용하여 0입니다. 두 변수가 독립적임을 나타내며 1은 두 변수가 완전히 상관됨을 의미합니다. 예를 들어 상호 정보 분류 코드는 다음과 같습니다.

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

모든 기능의 상호 정보는 0보다 큰 것으로 추정되므로 모든 기능은 레이블과 관련이 있습니다.

2.2 삽입 방법

임베딩 방법은 알고리즘이 사용할 기능, 즉 기능 선택과 알고리즘 훈련을 동시에 수행 할 수 있도록하는 방법입니다.
여기에 사진 설명 삽입

2.3 래퍼 포장 방법

패키징 방법은 기능 선택과 알고리즘 학습을 동시에 수행하는 방법이기도합니다. 임베딩 방법과 매우 유사합니다. 또한 coef_attribute 또는 feature_importances_attribute와 같은 알고리즘 자체의 선택에 의존하여 기능 선택을 완료합니다. 그러나 차이점은
특정 평가 지수 또는 통계 임계 값을 입력하는 대신 목적 함수를 종종 기능을 선택 하는 데 도움이되는 블랙 박스로 사용한다는 것 입니다.
여기에 사진 설명 삽입

추천

출처blog.csdn.net/qq_45617555/article/details/112308688