numpy 배열 대신 팬더와 sklearn fit_transform을 사용하고 데이터 프레임을 반환하는 방법은 무엇입니까?
판다 데이터 프레임에 스케일링(sklearn.preprocessing의 StandardScaler() 사용)을 적용하고 싶습니다.다음 코드는 numpy 배열을 반환하므로 모든 열 이름과 인덱스가 손실됩니다.이건 제가 원하는 게 아닌데요.
features = df[["col1", "col2", "col3", "col4"]]
autoscaler = StandardScaler()
features = autoscaler.fit_transform(features)
온라인에서 찾은 "솔루션"은 다음과 같습니다.
features = features.apply(lambda x: autoscaler.fit_transform(x))
작동하는 것처럼 보이지만 사용되지 않음 경고가 표시됩니다.
/usr/lib/site3.5/site-sklearn/sklearn/재처리/data.py:583: 사용 중지 경고: 1d 어레이를 데이터로 전달하는 것은 0.17에서 사용되지 않으며 0.19에서 ValueError를 발생시킵니다.데이터에 단일 피쳐가 있는 경우 X.reshape(-1, 1)를 사용하거나 단일 표본이 포함된 경우 X.reshape(-1, 1)를 사용하여 데이터의 모양을 변경합니다.
그래서 저는 노력했습니다.
features = features.apply(lambda x: autoscaler.fit_transform(x.reshape(-1, 1)))
하지만 이는 다음과 같습니다.
추적(최신 통화 마지막):파일 "/.analyse.py ", 91행, 기능 = features.dll(x: autoscaler).fit_reshape(x.reshape (-1, 1)) 파일 "/usr/lib/site3.5/site-slot/slot/slot/core/frame.py ", 라인 3972, 적용 자체._filename_standard(f, 축, reduct=self) 파일 "/usr/lib/lib3.5/site-site-session/core/core/frame.py ", 행 4081, in _filename_standard result = self._filenger(data=syslog, index=index) 파일 "/usr/lib/site3.5/site-filename/site-filename/core/frame.py ", intmgr = self._init_syslog(데이터, 인덱스, 열, dtype=dtype) 파일 "/usr/lib/site-syslog/core/frame.py ", 행 363, _init_sitedtype=dtype) 파일 "/usr/lib/site3.5/site-syslog/core/core", 행 5163, _homogenize(데이터, 인덱스, dtype) 배열 = _homogenize(데이터, line/site/site/site/dtype) 파일 "/core/syslog7, _homogenize raise_cast_failure=False) 파일 "/usr/lib/site3.5/site-site-session/core/core/series.py ", 라인 2885, _homogenize_array raise Exception('데이터는 1차원이어야 함')에서 예외:데이터는 1차원이어야 합니다.
데이터 프레임을 그대로 둔 상태에서 판다 데이터 프레임에 스케일링을 적용하려면 어떻게 해야 합니까?가능한 경우 데이터를 복사하지 않습니다.
를 사용하여 데이터 프레임을 numpy 배열로 변환할 수 있습니다. 랜덤 데이터 집합의 예:
편집: 변경as_matrix()
values
에 따라.as_matrix()
위의 문서:
일반적으로 '.values'를 사용하는 것이 좋습니다.
import pandas as pd
import numpy as np #for the random integer example
df = pd.DataFrame(np.random.randint(0.0,100.0,size=(10,4)),
index=range(10,20),
columns=['col1','col2','col3','col4'],
dtype='float64')
참고로 지수는 10-19입니다.
In [14]: df.head(3)
Out[14]:
col1 col2 col3 col4
10 3 38 86 65
11 98 3 66 68
12 88 46 35 68
지금이다fit_transform
데이터 프레임을 사용하여 데이터를 저장하고scaled_features
array
:
from sklearn.preprocessing import StandardScaler
scaled_features = StandardScaler().fit_transform(df.values)
In [15]: scaled_features[:3,:] #lost the indices
Out[15]:
array([[-1.89007341, 0.05636005, 1.74514417, 0.46669562],
[ 1.26558518, -1.35264122, 0.82178747, 0.59282958],
[ 0.93341059, 0.37841748, -0.60941542, 0.59282958]])
" " " " " " (으)로 표시합니다.index
그리고.columns
원래 인덱스 및 열 이름을 유지하는 키워드 인수:
scaled_features_df = pd.DataFrame(scaled_features, index=df.index, columns=df.columns)
In [17]: scaled_features_df.head(3)
Out[17]:
col1 col2 col3 col4
10 -1.890073 0.056360 1.745144 0.466696
11 1.265585 -1.352641 0.821787 0.592830
12 0.933411 0.378417 -0.609415 0.592830
편집 2:
sklearn-pandas 패키지를 발견했습니다.그것은 만화를 판다와 함께 사용하기 쉽게 만드는 것에 초점을 맞추고 있습니다.sklearn-pandas
두 가지 이상의 변환 유형을 열 부분 집합에 적용해야 할 경우 특히 유용합니다.DataFrame
보다 일반적인 시나리오문서화되어 있지만, 이렇게 하면 방금 수행한 혁신을 달성할 수 있습니다.
from sklearn_pandas import DataFrameMapper
mapper = DataFrameMapper([(df.columns, StandardScaler())])
scaled_features = mapper.fit_transform(df.copy(), 4)
scaled_features_df = pd.DataFrame(scaled_features, index=df.index, columns=df.columns)
import pandas as pd
from sklearn.preprocessing import StandardScaler
df = pd.read_csv('your file here')
ss = StandardScaler()
df_scaled = pd.DataFrame(ss.fit_transform(df),columns = df.columns)
df_scaled는 '동일한' 데이터 프레임이 될 것입니다. 이제 확장된 값만 사용됩니다.
df.values에 다시 할당하면 인덱스와 열이 모두 보존됩니다.
df.values[:] = StandardScaler().fit_transform(df)
features = ["col1", "col2", "col3", "col4"]
autoscaler = StandardScaler()
df[features] = autoscaler.fit_transform(df[features])
이 기능은 MinMaxScaler와 함께 어레이 값을 원래 데이터 프레임으로 되돌리는 데 사용되었습니다.StandardScaler에서도 작동해야 합니다.
data_scaled = pd.DataFrame(scaled_features, index=df.index, columns=df.columns)
여기서 data_filename은 새 데이터 프레임, scale_filename = 정규화 후 배열, df = 원래 데이터 프레임으로 인덱스와 열을 반환해야 합니다.
내게 맞는 제품:
from sklearn.preprocessing import StandardScaler
cols = list(train_df_x_num.columns)
scaler = StandardScaler()
train_df_x_num[cols] = scaler.fit_transform(train_df_x_num[cols])
sklearn Version 1.2부터 평가자는 열 이름을 유지하는 데이터 프레임을 반환할 수 있습니다. set_output
를 호출하여 추정기별로 구성할 수 있습니다.set_output
설정을 set_config(transform_output="pandas")
scikit-learn 1.2 - set_output API를 사용한 판다 출력에 대한 릴리스 하이라이트를 참조하십시오.
예:set_output()
:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().set_output(transform="pandas")
예:set_config()
:
from sklearn import set_config
set_config(transform_output="pandas")
제가 한 일은 이렇습니다.
X.Column1 = StandardScaler().fit_transform(X.Column1.values.reshape(-1, 1))
Neuraxle을 사용하여 scikit-learn에서 여러 데이터 유형을 혼합할 수 있습니다.
옵션 1: 행 이름 및 열 이름 삭제
from neuraxle.pipeline import Pipeline
from neuraxle.base import NonFittableMixin, BaseStep
class PandasToNumpy(NonFittableMixin, BaseStep):
def transform(self, data_inputs, expected_outputs):
return data_inputs.values
pipeline = Pipeline([
PandasToNumpy(),
StandardScaler(),
])
그런 다음 원하는 대로 진행합니다.
features = df[["col1", "col2", "col3", "col4"]] # ... your df data
pipeline, scaled_features = pipeline.fit_transform(features)
옵션 2: 원래 열 이름과 행 이름을 유지
다음과 같은 포장지로도 이 작업을 수행할 수 있습니다.
from neuraxle.pipeline import Pipeline
from neuraxle.base import MetaStepMixin, BaseStep
class PandasValuesChangerOf(MetaStepMixin, BaseStep):
def transform(self, data_inputs, expected_outputs):
new_data_inputs = self.wrapped.transform(data_inputs.values)
new_data_inputs = self._merge(data_inputs, new_data_inputs)
return new_data_inputs
def fit_transform(self, data_inputs, expected_outputs):
self.wrapped, new_data_inputs = self.wrapped.fit_transform(data_inputs.values)
new_data_inputs = self._merge(data_inputs, new_data_inputs)
return self, new_data_inputs
def _merge(self, data_inputs, new_data_inputs):
new_data_inputs = pd.DataFrame(
new_data_inputs,
index=data_inputs.index,
columns=data_inputs.columns
)
return new_data_inputs
df_scaler = PandasValuesChangerOf(StandardScaler())
그런 다음 원하는 대로 진행합니다.
features = df[["col1", "col2", "col3", "col4"]] # ... your df data
df_scaler, scaled_features = df_scaler.fit_transform(features)
이 코드를 사용하면 인덱스가 있는 데이터 프레임을 얻을 수 있습니다.
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston # boston housing dataset
dt= load_boston().data
col= load_boston().feature_names
# Make a dataframe
df = pd.DataFrame(data=dt, columns=col)
# define a method to scale data, looping thru the columns, and passing a scaler
def scale_data(data, columns, scaler):
for col in columns:
data[col] = scaler.fit_transform(data[col].values.reshape(-1, 1))
return data
# specify a scaler, and call the method on boston data
scaler = StandardScaler()
df_scaled = scale_data(df, col, scaler)
# view first 10 rows of the scaled dataframe
df_scaled[0:10]
슬라이싱을 사용하여 데이터 프레임에 Numpy 배열을 직접 할당할 수 있습니다.
from sklearn.preprocessing import StandardScaler
features = df[["col1", "col2", "col3", "col4"]]
autoscaler = StandardScaler()
features[:] = autoscaler.fit_transform(features.values)
언급URL : https://stackoverflow.com/questions/35723472/how-to-use-sklearn-fit-transform-with-pandas-and-return-dataframe-instead-of-num
'source' 카테고리의 다른 글
iTunes Connect에서 앱 삭제 (0) | 2023.08.24 |
---|---|
ASP 버튼 안에 있는 멋진 글꼴 (0) | 2023.08.24 |
.Net Core 2.0 Windows 서비스 (0) | 2023.08.24 |
프런트 엔드 도커 파일로 해결하지 못했습니다. (0) | 2023.08.19 |
함수의 커서 - MariaDB (0) | 2023.08.19 |