기계 학습 / HAI 기준선

TRAIN_DATASET = sorted((x for x in Path("/Users/kibeom/HAI/dataset/train").glob("*.csv")))
TRAIN_DATASET

(PosixPath('/Users/kibeom/HAI/dataset/train/train1.csv'),
 PosixPath('/Users/kibeom/HAI/dataset/train/train2.csv'),
 PosixPath('/Users/kibeom/HAI/dataset/train/train3.csv'),
 PosixPath('/Users/kibeom/HAI/dataset/train/train4.csv'),
 PosixPath('/Users/kibeom/HAI/dataset/train/train5.csv'),
 PosixPath('/Users/kibeom/HAI/dataset/train/train6.csv'))

정렬된 함수는 정렬할 데이터 목록을 반환하는 함수입니다.

정렬할 데이터는 경로에 있는 csv 파일입니다. CSV 파일은 glob 방법을 사용하여 검색되었습니다.

glob 메소드는 조건에 맞는 파일명을 리스트 형태로 반환합니다.

이렇게 작성하면 루프문을 사용하지 않고 한 줄로 디렉토리에서 조건에 맞는 파일을 검색할 수 있습니다.

def dataframe_from_csv(target):
    return pd.read_csv(target).rename(columns=lambda x:x.strip())

def dataframe_from_csvs(targets):
    return pd.concat((dataframe_from_csv(x) for x in targets))

다음은 CSV 파일을 데이터 프레임으로 변환하는 함수입니다.

먼저 첫 번째 기능을 살펴보겠습니다.

read_csv 메서드를 사용하여 대상 csv 파일을 읽고 rename을 사용하여 열 이름을 바꿉니다.

람다는 익명으로 함수를 만드는 방법이며 람다 식이라고 합니다.

strip() 함수는 문자열에서 앞뒤 공백을 제거하는 함수입니다. 즉, x에 대한 공백을 제거합니다.

이를 별도의 함수로 만들지 않고 rename으로 표현하고 공백을 제거한 x를 반환합니다.

마지막에 공백이 있는 열은 람다 식을 적용하여 공백이 아닌 이름으로 이름을 바꿉니다.

반환 값은 읽기 대상의 데이터 프레임입니다.

두 번째 함수는 첫 번째 함수를 사용하여 데이터 프레임을 병합합니다. 즉, train1.csv, train2.csv, … 등이 하나의 데이터 프레임으로 결합됩니다.

하나의 간단한 기능으로 번거로움을 덜 수 있습니다.

TRAIN_DF_RAW = dataframe_from_csvs(TRAIN_DATASET)
TRAIN_DF_RAW


위에서 선언한 함수를 사용하여 기차 레코드를 단일 데이터 프레임으로 변환합니다.

TIMESTAMP_FILED = "timestamp"
ATTACK_FIELD = "Attack"
VALID_COLUMNS_IN_TRAIN_DATASET = TRAIN_DF_RAW.columns.drop((TIMESTAMP_FILED,ATTACK_FIELD))
VALID_COLUMNS_IN_TRAIN_DATASET


존재하지 않는 필드가 있는 경우 필드 이름을 가져옵니다.

그리고 타임스탬프 및 레이블 필드를 제외합니다. 이 경우 드롭이 사용됩니다.

TRAIN_DF_RAW.drop(columns=(“timestamp”,”Attack”))으로 사용할 수도 있습니다.

다음은 정규화 과정입니다.

TAG_MIN = TRAIN_DF_RAW(VALID_COLUMNS_IN_TRAIN_DATASET).min()
TAG_MAX = TRAIN_DF_RAW(VALID_COLUMNS_IN_TRAIN_DATASET).max()

def normalize(df):
    ndf = df.copy()
    for c in df.columns:
        ndf(c) = (df(c) - TAG_MIN(c)) / (TAG_MAX(c) - TAG_MIN(c))
    return ndf

정규화는 0과 1 사이의 데이터 값을 표현하는 방법입니다.


def boundary_check(df):
    x = np.array(df, dtype=np.float32)
    return np.any(x > 1.0), np.any(x < 0), np.any(np.isnan(x))
boundary_check(TRAIN_DF)

또한 정규화 후 1보다 크거나 0보다 작은 Nan 값이 있는지 확인합니다.