text embedding- 칼럼명을 단순히 숫자로 바꿀때 쓰는 인베딩방법
one hot incoding - 칼럼명을 단순히 숫자로 바꾸는 것 뿐만 아니라 순서를 두고싶지않고 고유의 번호로 지정하고 싶을때 쓰는 인코딩 방법
- 원핫 인코딩은 출력하면 넘파이 배열이 아닌 SciPy의 희소행렬(Sparse matrix)형태로 나옴 (1만 메모리에 넣음, 0은 안넣음)
- 데이터가 많아도 효율적임, 희소행렬은 0이 아닌 원소의 위치만 저장하면 되기 때문
- 물론, 넘파이 array 형태로도 바꿀 수 있음
나만의 변환기
추가 특성을 위해 사용자 특정의 변환기를 만드는 것도 가능
from sklearn.base import BaseEstimator, TransformerMixin
# 열 인덱스
rooms_ix, bedrooms_ix, population_ix, households_ix = 3, 4, 5, 6
class CombinedAttributesAdder(BaseEstimator, TransformerMixin):
def __init__(self, add_bedrooms_per_room=True): # *args 또는 **kargs 없음
self.add_bedrooms_per_room = add_bedrooms_per_room
def fit(self, X, y=None): #무조건 넣어주기 (데이터로부터 통계값을 뽑거나 정보를 얻어야 하는 과정이 있으면)
return self # 아무것도 하지 않습니다
def transform(self, X): # 무조건 넣어주기 (데이터 정제가 적용되는 부분)
rooms_per_household = X[:, rooms_ix] / X[:, households_ix]
population_per_household = X[:, population_ix] / X[:, households_ix]
if self.add_bedrooms_per_room:
bedrooms_per_room = X[:, bedrooms_ix] / X[:, rooms_ix]
return np.c_[X, rooms_per_household, population_per_household,
bedrooms_per_room]
else:
return np.c_[X, rooms_per_household, population_per_household]
attr_adder = CombinedAttributesAdder(add_bedrooms_per_room=False)
housing_extra_attribs = attr_adder.transform(housing.to_numpy())
fit과 transform의 사용 이유(모든 사이킷런에서 fit과 transfrom을 사용하기때문에)
fit과 transform 메서드는 주로 머신러닝 모델의 전처리 단계에서 사용됩니다.
- fit: 메서드는 주어진 데이터로부터 학습을 합니다. 예를 들어, 데이터의 평균이나 표준편차를 계산할 때 사용됩니다. CombinedAttributesAdder 클래스에서는 아무것도 하지 않기 때문에 단순히 객체 자신을 반환합니다.
- transform: 메서드는 데이터를 변환하는 역할을 합니다. fit 메서드에서 학습한 내용을 바탕으로 데이터를 변환합니다. 예를 들어, 새로운 특성을 추가하거나 데이터를 스케일링하는 작업이 여기에 포함됩니다.
- fit_transform을 이용하여 fit과 transform을 동시에 할 수 있음
- 단, test 데이터에서는 fit을 할 일이 없으니 transform만 하면 됨
CombinedAttributesAdder 클래스에서는 transform 메서드에서 실제로 새로운 특성들을 추가하는 작업이 이루어집니다.
(매우중요) 스케일링
- 사용이유 데이터의 특성마다 스케일이 너무 달라서
- 가격 column은 만 단위인 반면 위도, 경도 colum 십 단위이다
정규화(normalization) != 표준화(standardization) != 규제화(regularization)
- min-max normalization (정규화)
-- 0~1 범위안에 모든 값이 들어가도록 스케일 조정
-- 최대, 최소 분명하거나 분명 해야 하는 경우
-- 이미지 데이터는 무조건 min-max 쓰는데 색이(0~255)로 나뉘기 때문
- standardization (표준화)
-- 평균을 뺀 다음 표준편차로 나누어서 분포의 분산이 1이 되도록 한다
-- 범위의 상한과 하한이 없어서 인공신경망에 사용하기엔 문제가 생길 수도 있다
-- 이상치에 영향을 덜 받음 (1개의 극단 적인 값이 발생할 때 normalization은 나머지 값들이 엄청나게 스케일링이 되지만 standardization은 다른 값들에 크게 영향을 주지 않음)
변환 파이프라인
- 변환단계가 많을 때 정확한 순서대로 처리하기 위해 파이프라인을 사용해볼 수 있다
- 이름은 어떻게 짓든 상관 없다
파이프라인
예시)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
num_pipeline = Pipeline([
('imputer', SimpleImputer(strategy="median")),
('attribs_adder', CombinedAttributesAdder()), #앞서만든 변환기 이름
('std_scaler', StandardScaler()),
])
housing_num_tr = num_pipeline.fit_transform(housing_num)
범주형데이터로도 파이프라인을 만들수있다
예시)
from sklearn.compose import ColumnTransformer
num_attribs = list(housing_num)
cat_attribs = ["ocean_proximity"]
full_pipeline = ColumnTransformer([
("num", num_pipeline, num_attribs),
("cat", OneHotEncoder(), cat_attribs),
])
housing_prepared = full_pipeline.fit_transform(housing)
회귀에서 성능평가할 때 MSE를 씀:
차이를 계산할 때 왜 제곱을 할까? 뺄셈하고 끝내면 되는거 아닌가?
오차의 크기를 보기위해서 오차를 제곱한다
MAE
차이를 계산할때 제곱으로인한 차이가 극명하게 갈리는것 보다 정확한 차이를 보고싶을떈 MAE사용 제곱X(절대값사용)
MAE는 RMSE: (회귀 모델의 예측 성능을 평가하는 지표 중 하나)
와의 비교를 해볼수 있음
- 오차가 없어도 방심하면 안된다 과대적합(overfitting)일 수도 있음!
- 명확하게 성능을 평가할 거면 어쨌든 test 데이터를 평가해야 가장 명확하고
- 중간점검을 하기 위해서 validation data를 만들어 볼 수 있다
- train dataset에서 일부 떼어내면 됨
- 최종적으로는 train, valid, test 데이터가 구성
validation에 하필 이상값들이 있을 때 쓸수있는 cross validation(단점 시간이오래걸림)
RandomForestRegressor:
앙상블 기법을 사용한 방법으로, 무작위로 특성을 선택해서 많은 결정트리를 만든 다음 그 예측을 평균 내는 방식
결과가 잘 나오긴 하지만 여전히 train 데이터에 과대적합되어 있음
이러한 과대적합 문제를 해결하기 위해 모델을 간단히 하거나, 규제를 하거나 더 많은 train 데이터를 모으는 것이 필요
또한, 하이퍼파라미터를 조절하며 학습해볼 필요가 있고 또 다른 알고리즘을 시도 해봐야 함
'머신러닝 기초 파이썬 첼린지' 카테고리의 다른 글
머신러닝 기초 5강 (1) | 2024.06.10 |
---|---|
회귀 (1) | 2024.06.07 |
머신러닝 기초 4강 (0) | 2024.06.07 |
머신러닝 기초 2강 (0) | 2024.05.30 |
머신러닝 기초 1강 (0) | 2024.05.30 |