본문 바로가기
『 Python 』/AI

[AI] 2.1 데이터셋 다루기

by Play IT 2023. 2. 6.
반응형
# 사이킷런으로 간단하게 나누기
from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(housing,test_szie=0.2, random_state=42)




# 계층적 샘플링 
# 너무많은 계층으로 나뉘면 안되며 각 계층별로 충분히 커야 한다. 

housing["income_cat"] = pd.cut(housing["median_income"], bin=[0.,1.5,3.0,4.5,6., np.inf], labels=[1,2,3,4,5])

# PANDAS

import pandas as pd

def load_data():
	return pd.read_csv(csv_path)

#데이터 구조 흝어보기

A = load_data()

# 처음 다섯 행 확인
A.head()

# 각 특성의 데이터 타입과 null이 아닌 개수 확인
A.info()

# 범주형에 어떤카테고리가 있는지 확인
A["categorical"].value_counts()

# 특성의 요약 정보
# couynt, mean, min, max, quartile
A.describe() 





#히스토그램으로 확인하기 
%matplotlib inline
import matplotlib.pyplot as plt
A.hist(bins=5, figsize=(20,15)
plt.show()

 

# 각 데이터가 어떤 의미를 지니고 어떻게 계산되는지 이해하고 있어야함

# 스케일링 

 

 

테스트 세트 만들기

 

# 일반적인 데이터 셋 나누기
import numpy as np

def split_train_test(data, test_ratio):
	# np.random.seed(42) # 난수 발생기의 초기값을 지정해 사용할수있다.
	shuffled_indices = np.random.permutation(len(data))
    test_set_size = int(len(data) * test_ratio)
    test_indices = shuffled_indices[:test_set_size]
    train_indices = shuffled_indices[test_set_size:]
    return data.iloc[train_indices], data.iloc[test_indices]
    

# 각 샘플마다 식별자의 해시값을 계산하여 해시 최댓값의 20%보다 작거나 같은 샘플만 테스트 세트로 보내도록 할 수 있다. 
#이렇게 반복하면 데이터셋이 갱신되더라도 테스트 세트가 동일하게 유지될수있다.

from zlib import crc32

def test_set_check(identifier, test_ratio):
	return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32
    
def split_train_test_by_id(data, test_ratio, id_column):
	ids = data[id_column]
    in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio))
    return data.loc[~in_test_set], data.loc[in_test_set]
    

A_with_id = A.reset_index()
train_set, test_set = split_train_test_by_id(housing_with_id, 0.2, "index")

housing_with_id["id"] = housing["longtiude"] * 1000 + housing["latitude"]
train_set, test_set = split_train_test_by_id(housing_with_id, 0.2, "id")

각 샘플마다 충분한 데이터가 있어야 데이터 편향이 발생하지 않는다.

 

훈련세트를 손상시키지 않기위해 복사본을 만들수 있다.

housing = strat_train_set.copy()


# 지리적 데이터를 시각화하기
housing.plot(kind="scatter", x="longitude", y="latitude")
housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.1)

# alpha값은 데이터가 많으면 많을수록 진하게 표시해준다. 


housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4,
            s=housing["population"]/100, label="population", figsize=(10,7),
            c="median_house_value", cmap=plt.get_cmap("jet"), colorbar=True,
            sharex=False
            )

plt.legend()


# x,y는 말그대로 위치 alpha는 선명도 
# s는 반지름크기
# c는 색깔을 부여해 낮으면파란색 높으면 빨간색으로

# 상관관계 살펴보기

corr_matrix = housing.corr()

corr_matrix["median_house_value"].sort_values(ascending=False)

# 숫자형 특성이 여러개일경우  상관관계가 높아 보이는 특성 몇가지만 살펴보기
from pandas.plotting import scatter_matrix
attributes = ["median_house_value","median_income","total_rooms","housing_median_age"]
scatter_matrix(housing[attributes], figsize=(12,8))

housing.plot(kind="scatter",x="median_income",y="median_house_value", alpha=0.1)

# 이미지를 보면은 45만달러 근처에 수평선이 보이고
# 35와 28만달러에도 수평선이 보이는대
# 이러한 값은 학습하지 않도록 제거해 주는것이 좋습니다.

 

 

 

 

 

머신러닝 알고리즘을 위한 데이터 준비

  1. 어떤 데이터셋에 대해서도 데이터 변환을 손쉽게 반복할 수 있다.
  2. 향후 프로젝트에 사용할 수 있는 변환 라이브러리를 점진적으로 구축할수 있다
  3. 실제 시스템에서 알고리즘에 새 데이터를 주입하기 전에 변환시키는데 활용될수 있다
  4. 여러 가지 데이터 변환을 쉽게 시도해 보며 어떤 조합이 좋은지 확인할 수 있다.
housing = strat_train_set.drop("median_house_value", axis=1)
housing_lables = strat_train_set["median_house_value"].copy()
# drop은 해당값만 drop하고 복사하는 체계이기에 원본을 건들지 않는다

데이터정제

  1. 해당 구역을 제거하기
  2. 전체 특성을 삭제하기
  3. 어떤 값으로 체우기 0 , 평균, 중간값으로

dropna(), drop(), fillna()

housing.dropna(subset=["total_bedrooms"])
housing.drop("total_bedrooms",axis=1)
median = housing["total_bedroom"].median()
housing["total_bedrooms"].fillna(median, inplace=True)

SimpleImputer sklearn 라이브러리를 이용하기

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy="median")
# 수치형만 계산되기에 ocean_proximity는 제외시켜야한다
housing_num = housing.drop("ocean_proximity", axis=1)
imputer.fit(housing_num)

imputer.statistics_
housing_num.median().values
X = imputer.transform(housing_num)
housing_tr = pd.DataFrame(X, columns=housing_num.columns, index=housing_num.index)

 

반응형

'『 Python 』 > AI' 카테고리의 다른 글

[AI] 분류  (0) 2023.02.07
[AI] DataFrame 메서드  (0) 2023.02.05
[AI] 2.1 머신러닝 프로젝트 흝어보기  (0) 2023.02.05
[AI] 1.3 머신러닝 테스트와 검증  (0) 2023.02.05
[AI] 1.2 머신러닝 주요 과제  (0) 2023.02.05

댓글