데이터 프레임의 열을 정규화하다
판다의 데이터 프레임에 각 열의 값 범위가 다릅니다.예를 들어 다음과 같습니다.
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데이터 유출을 방지합니다.
정보
표준화 및 정규화에 대한 자세한 내용은 다음과 같습니다.
- https://machinelearningmastery.com/standardscaler-and-minmaxscaler-transforms-in-python/
- https://en.wikipedia.org/wiki/Normalization_(statistics)
- https://scikit-learn.org/stable/modules/classes.html#module-sklearn.preprocessing
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
'programing' 카테고리의 다른 글
| 모키토 입문자들은 어떻게 일하나요? (0) | 2022.09.29 |
|---|---|
| 폐지된 관리 대상Query() 문제 (0) | 2022.09.29 |
| Jackson을 사용하여 어레이에 대한 JSON 문자열을 해석하는 방법 (0) | 2022.09.29 |
| 다음 오류로 인해 super()가 실패합니다.상위 항목이 개체에서 상속되지 않은 경우 TypeError "인수 1은 classobj가 아닌 유형이어야 합니다" (0) | 2022.09.29 |
| URI의 마지막 경로세그먼트를 취득하는 방법 (0) | 2022.09.29 |