programing

데이터 프레임의 열을 정규화하다

sourcejob 2022. 9. 29. 00:13
반응형

데이터 프레임의 열을 정규화하다

판다의 데이터 프레임에 각 열의 값 범위가 다릅니다.예를 들어 다음과 같습니다.

df:

A     B   C
1000  10  0.5
765   5   0.35
800   7   0.09

각 값이 0에서 1 사이인 이 데이터 프레임의 열을 정규화할 수 있는 방법을 알고 계십니까?

원하는 출력은 다음과 같습니다.

A     B    C
1     1    1
0.765 0.5  0.7
0.8   0.7  0.18(which is 0.09/0.5)

판다를 사용하는 간단한 방법 중 하나: (여기서 나는 평균 정규화를 사용하고 싶다)

normalized_df=(df-df.mean())/df.std()

min-max 정규화를 사용하려면:

normalized_df=(df-df.min())/(df.max()-df.min())

편집: 몇 가지 우려 사항을 해결하기 위해 Panda는 위의 코드에 자동으로 Column-wise 기능을 적용한다고 말할 필요가 있습니다.

sklearn 패키지 및 관련 전처리 유틸리티를 사용하여 데이터를 정규화할 수 있습니다.

import pandas as pd
from sklearn import preprocessing

x = df.values #returns a numpy array
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = pd.DataFrame(x_scaled)

자세한 내용은 데이터 전처리에 대한 스키킷 학습 문서(기능을 범위로 확장)를 참조하십시오.

이 투고에 근거합니다.https://stats.stackexchange.com/questions/70801/how-to-normalize-data-to-0-1-range

다음을 수행할 수 있습니다.

def normalize(df):
    result = df.copy()
    for feature_name in df.columns:
        max_value = df[feature_name].max()
        min_value = df[feature_name].min()
        result[feature_name] = (df[feature_name] - min_value) / (max_value - min_value)
    return result

여러분은 여러분의 가치관이 부정적인지 긍정적인지에 대해 계속 고민할 필요가 없습니다.그리고 값은 0과 1 사이에 적절히 분산되어 있어야 합니다.

정규화 방법의 상세 예시

  • 판다의 정규화(편향 없음)
  • Sklearn 정규화(편향)
  • 편파 대 편파 대 편파 대 편파가 머신 러닝에 영향을 미칩니까?
  • 최대 혼재 스케일링

참고 자료:위키백과: 표준 편차의 치우침 없는 추정

데이터 예시

import pandas as pd
df = pd.DataFrame({
               'A':[1,2,3],
               'B':[100,300,500],
               'C':list('abc')
             })
print(df)
   A    B  C
0  1  100  a
1  2  300  b
2  3  500  c

판다를 이용한 정규화(편견이 없는 추정치 제공)

정규화할 때 단순히 평균을 뺀 다음 표준 편차로 나눕니다.

df.iloc[:,0:-1] = df.iloc[:,0:-1].apply(lambda x: (x-x.mean())/ x.std(), axis=0)
print(df)
     A    B  C
0 -1.0 -1.0  a
1  0.0  0.0  b
2  1.0  1.0  c

sklearn을 사용한 정규화(판다와는 다른 편파적 추정치 제공)

sklearn른른른 !!!!!!!!!!!

import pandas as pd

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()


df = pd.DataFrame({
               'A':[1,2,3],
               'B':[100,300,500],
               'C':list('abc')
             })
df.iloc[:,0:-1] = scaler.fit_transform(df.iloc[:,0:-1].to_numpy())
print(df)
          A         B  C
0 -1.224745 -1.224745  a
1  0.000000  0.000000  b
2  1.224745  1.224745  c

sklearn에 대한 편파적인 추정은 머신러닝의 파워를 저하시킵니까?

아니요.

sklearn.preprocessing.scale의 공식 문서에는 편향된 추정치를 사용하는 것이 머신러닝 알고리즘의 성능에 영향을 줄 가능성은 낮으며 안전하게 사용할 수 있다고 기재되어 있습니다.

공식 문서:

합니다.numpy.std(x, ddof=0)의 해 주십시오.ddof모델 성능에 영향을 주지 않습니다.

MinMax Scaling은 어떻습니까?

MinMax 스케일링에는 표준 편차 계산이 없습니다.그래서 그 결과는 판다와 스키킷 학습에서 모두 같다.

import pandas as pd
df = pd.DataFrame({
               'A':[1,2,3],
               'B':[100,300,500],
             })
(df - df.min()) / (df.max() - df.min())
     A    B
0  0.0  0.0
1  0.5  0.5
2  1.0  1.0


# Using sklearn
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler() 
arr_scaled = scaler.fit_transform(df) 

print(arr_scaled)
[[0.  0. ]
 [0.5 0.5]
 [1.  1. ]]

df_scaled = pd.DataFrame(arr_scaled, columns=df.columns,index=df.index)
print(df_scaled)
     A    B
0  0.0  0.0
1  0.5  0.5
2  1.0  1.0

실제로는 다음과 같은 열에 작용하는 단순한 변환에 문제가 있습니다.

def f(s):
    return s/s.max()

frame.apply(f, axis=0)

또는 더 간결하게:

   frame.apply(lambda x: x/x.max(), axis=0)

패키지를 하는 것을 좋아한다면, 은 판다를 할 수 .loc다음과 같이 합니다.

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler() 
scaled_values = scaler.fit_transform(df) 
df.loc[:,:] = scaled_values

답변은 [0, n] 범위의 데이터에만 적용되므로 주의해야 합니다.이것은, 어떠한 데이터 범위에서도 동작하지 않습니다.


심플하고 아름다운 것:

df["A"] = df["A"] / df["A"].max()
df["B"] = df["B"] / df["B"].max()
df["C"] = df["C"] / df["C"].max()

정규화할 열 목록을 생성할 수 있습니다.

column_names_to_normalize = ['A', 'E', 'G', 'sadasdsd', 'lol']
x = df[column_names_to_normalize].values
x_scaled = min_max_scaler.fit_transform(x)
df_temp = pd.DataFrame(x_scaled, columns=column_names_to_normalize, index = df.index)
df[column_names_to_normalize] = df_temp

팬더 데이터 프레임은 이제 원하는 열에서만 정규화되었습니다.


그러나 반대로 정규화하지 않을 열의 목록을 선택하십시오. 모든 열의 목록을 만들고 원하지 않는 열을 제거할 수 있습니다.

column_names_to_not_normalize = ['B', 'J', 'K']
column_names_to_normalize = [x for x in list(df) if x not in column_names_to_not_normalize ]

팬더에게 더 좋은 방법은

df = df/df.max().astype(np.float64)

편집 데이터 프레임에 음수가 있는 경우 대신 사용해야 합니다.

df = df/df.loc[df.abs().idxmax()].astype(np.float64)

Sandman과 Pravein이 제시한 솔루션은 매우 좋습니다.데이터 프레임의 다른 열에 범주형 변수가 있는 경우에는 이 방법을 일부 수정해야 합니다.

이러한 유형의 문제에 대한 해결 방법은 다음과 같습니다.

 from sklearn import preprocesing
 x = pd.concat([df.Numerical1, df.Numerical2,df.Numerical3])
 min_max_scaler = preprocessing.MinMaxScaler()
 x_scaled = min_max_scaler.fit_transform(x)
 x_new = pd.DataFrame(x_scaled)
 df = pd.concat([df.Categoricals,x_new])

데이터 라벨이나 카테고리 컬럼이 변경되지 않은 회귀 태스크와 같이 일부 컬럼을 정규화하고 다른 컬럼을 변경하지 않는 것이 좋습니다.따라서 다음과 같은 방법을 권장합니다(@shg와 @Cina 응답의 조합).

features_to_normalize = ['A', 'B', 'C']
# could be ['A','B'] 

df[features_to_normalize] = df[features_to_normalize].apply(lambda x:(x-x.min()) / (x.max()-x.min()))

그것은 단순한 수학일 뿐이다.답은 다음과 같이 간단해야 합니다.

normed_df = (df - df.min()) / (df.max() - df.min())
df_normalized = df / df.max(axis=0)

목록 이해를 사용하여 열 단위로 수행하는 방법은 다음과 같습니다.

[df[col].update((df[col] - df[col].min()) / (df[col].max() - df[col].min())) for col in df.columns]

팬더들은 간단히 사용할 수 있습니다.DataFrame.transform1은 다음과 같이 기능합니다.

df.transform(lambda x: x/x.max())

정규화

하시면 됩니다.minmax_scale0-1로 하다

from sklearn.preprocessing import minmax_scale
df[:] = minmax_scale(df)

표준화

하시면 됩니다.scale각 열의 중심을 평균으로 맞추고 단위 분산을 척도화합니다.

from sklearn.preprocessing import scale
df[:] = scale(df)

컬럼 서브셋

단일 열 정규화

from sklearn.preprocessing import minmax_scale
df['a'] = minmax_scale(df['a'])

숫자 열만 정규화

import numpy as np
from sklearn.preprocessing import minmax_scale
cols = df.select_dtypes(np.number).columns
df[cols] = minmax_scale(df[cols])

완전한 예

# Prep
import pandas as pd
import numpy as np
from sklearn.preprocessing import minmax_scale

# Sample data
df = pd.DataFrame({'a':[0,1,2], 'b':[-10,-30,-50], 'c':['x', 'y', 'z']})

# MinMax normalize all numeric columns
cols = df.select_dtypes(np.number).columns
df[cols] = minmax_scale(df[cols])

# Result
print(df)

#    a    b  c
# 0  0.0  1.0  x
# 2  0.5  0.5  y
# 3  1.0  0.0  z

주의:

예에서 " " " 입니다.scale 할 수 minmax_scale, 열 또는 변경하지 않고 합니다. 인덱스, 열 이름 또는 숫자가 아닌 변수를 변경하지 않습니다.각 열에 대해 함수가 적용됩니다.

주의:

러닝의 는, 「」를 합니다.minmax_scale ★★★★★★★★★★★★★★★★★」scale train_test_split데이터 유출을 방지합니다.

정보

표준화 및 정규화에 대한 자세한 내용은 다음과 같습니다.

def normalize(x):
    try:
        x = x/np.linalg.norm(x,ord=1)
        return x
    except :
        raise
data = pd.DataFrame.apply(data,normalize)

판다의 문서에서 DataFrame 구조는 그 자체로 운영(기능)을 적용할 수 있습니다.

DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

DataFrame의 입력축을 따라 함수를 적용합니다.함수에 전달되는 개체는 DataFrame의 인덱스(축=0) 또는 열(축=1)을 가진 Series 개체입니다.반환 유형은 전달된 함수가 집계되는지 아니면 DataFrame이 비어 있는 경우 reduate 인수에 따라 달라집니다.

커스텀 함수를 적용하여 Data Frame을 조작할 수 있습니다.

다음 함수는 Z 점수를 계산합니다.

def standardization(dataset):
  """ Standardization of numeric fields, where all values will have mean of zero 
  and standard deviation of one. (z-score)

  Args:
    dataset: A `Pandas.Dataframe` 
  """
  dtypes = list(zip(dataset.dtypes.index, map(str, dataset.dtypes)))
  # Normalize numeric columns.
  for column, dtype in dtypes:
      if dtype == 'float32':
          dataset[column] -= dataset[column].mean()
          dataset[column] /= dataset[column].std()
  return dataset

한 줄로 할 수 있습니다.

DF_test = DF_test.sub(DF_test.mean(axis=0), axis=1)/DF_test.mean(axis=0)

각 열에 대한 평균을 취한 다음 모든 행에서 평균(평균)을 뺀 다음(특정 열의 평균은 해당 행에서만 뺀 값) 평균으로 나눕니다.마지막으로 정규화된 데이터 세트를 얻을 수 있습니다.

판다들은 기본적으로 기둥에 대한 정규화를 한다.다음 코드를 사용해 보십시오.

X= pd.read_csv('.\\data.csv')
X = (X-X.min())/(X.max()-X.min())

출력 값은 0과 1의 범위입니다.

프로세스 속도를 높이는 람다와 함께 적용 함수를 사용합니다.

def normalize(df_col):

  # Condition to exclude 'ID' and 'Class' feature
  if (str(df_col.name) != str('ID') and str(df_col.name)!=str('Class')):
        max_value = df_col.max()
        min_value = df_col.min()

        #It avoids NaN and return 0 instead
        if max_value == min_value:
          return 0

        sub_value = max_value - min_value
        return np.divide(np.subtract(df_col,min_value),sub_value)
  else:
        return df_col

 df_normalize = df.apply(lambda x :normalize(x))

데이터가 양의 방향으로 치우쳐 있는 경우 로그 변환을 사용하는 것이 가장 좋습니다.

df = np.log10(df)

언급URL : https://stackoverflow.com/questions/26414913/normalize-columns-of-a-dataframe

반응형