4. 모델 학습을 위한 데이터 정리

차원 감소



차원 감소로 이동하기 전에. 첫 번째 질문은 Dimensionality가 정확히 무엇입니까?

데이터 세트의 차원은 Label/Target 열을 제외한 데이터 세트의 기능에 불과합니다. 예를 들어 데이터 세트에는 총 84개의 열이 있습니다. 따라서 우리의 차원은 84-1=83입니다. 여기서 1은 레이블 열을 나타냅니다.

차원 축소를 수행해야 하는 이유는 무엇입니까?



더 많은 기능은 더 많은 학습을 의미하므로 데이터 세트를 교육하는 데 더 많은 시간이 소요됩니다. 따라서 기계 학습 모델의 학습에 긍정적으로 기여하는 기능을 선택해야 합니다. 또한 모델 학습에 부정적인 영향을 미치는 노이즈가 있는 기능을 제거하는 것도 우리의 책임입니다.

제로 표준 편차로 열/기능 제거



에서 STD가 0인 열을 조사했습니다.

stats = merge_df.describe()
std = stats.loc['std']
features_no_variance = std[std == 0.0].index
print(features_no_variance)



print("Datashape before removal")
print(merge_df.shape)
merge_df = merge_df.drop(columns=features_no_variance)
print("Datashape after removal")
print(merge_df.shape)


원치 않는 문자열 기능 제거



대부분의 기계 학습 모델. 문자열 기능을 직접 사용하지 않습니다. 따라서 Variable Encoding으로 숫자에 매핑하거나 NLP를 사용할 수도 있습니다. 그러나 지금은 범위 밖입니다.

우리는 이전부터 알고 있습니다. 다음 문자열 열/기능이 있습니다.

The Categorical column are below
[' Timestamp', ' Destination IP', 'Flow ID', ' Label', ' Source IP']



레이블 열 이외의 모든 열은 기계 학습 모델에 필요하지 않습니다. 흐름 ID 및 타임스탬프는 각 레코드에 대해 고유하며 각 레코드에 고유한 값을 가진 기능은 모델 학습에 크게 기여하지 않습니다. STD가 0이라고 말하는 것과 같지만 차이점은 숫자 열/기능이 아닌 문자열이라는 것입니다(.describe 메서드는 기본적으로 문자열 기능을 처리하지 않으므로 거기에 표시되지 않는 이유). 소스 IP 및 대상 IP를 기반으로 모델이 예측하는 것을 원하지 않으므로 소스 IP 및 대상 IP에 대한 유용한 수치 매핑을 가질 수 없습니다. IP가 네트워크에서 변경될 수 있기 때문입니다. 하나의 로컬 네트워크에 하나의 악성 IP가 있고 다른 로컬 네트워크에 다른 IP가 있을 수 있습니다. 또한 IP 할당은 네트워크에서 변경될 수 있습니다. 따라서 우리는 IP와 독립적인 예측을 원합니다. 따라서 이러한 기능/열도 제거합니다.

str_cols = list(set(merge_df.columns)-set(discriptive_stat.columns))
str_cols.remove(' Label')
print(str_cols)


위의 스니펫은 기능 목록을 제공합니다. 떨어뜨려야 합니다.

merge_df = merge_df.drop(columns=str_cols)
print("Datashape after removal")
print(merge_df.shape)


Datashape after removal (2830434, 73)



따라서 이 시점에서 73개의 기능으로 끝납니다.

Null 및 Infinite 값 제거



앞에서 언급한 것처럼 Null/무한 값이 있는 행/레코드/인스턴스도 기계 학습 모델에 기여하지 않습니다. 그것들은 모델의 노이즈 요인 중 하나입니다. 그러니 그들을 처리합시다.

무한 값 제거



유한하지 않은 값을 포함하는 열을 확인합니다.

labl = merge_df[' Label']
dataset = merge_df.loc[:, merge_df.columns != ' Label'].astype('float64')
nonfinite = [col for col in dataset if not np.all(np.isfinite(dataset[col]))]
print(nonfinite)


각 열에 포함된 유한하지 않은 값의 수를 확인합니다.

finite = np.isfinite(merge_df['Flow Bytes/s']).sum()
print("FlowBytes/s: "+str(merge_df.shape[0] - finite))
finite = np.isfinite(merge_df[' Flow Packets/s']).sum()
print("Flow Packets/s  "+str(merge_df.shape[0] - finite))


무한 값을 처리하는 방법에는 여러 가지가 있습니다. 예를 들어 각 열의 평균으로 바꿀 수 있습니다. 여기에서는 그것들이 매우 적기 때문에 간단히 제거할 것입니다. 유한하지 않은 값이 적기 때문에 데이터 세트에서 안전하게 제거할 수 있습니다. 무한한 값을 NaN 값으로 대체합니다.

merge_df = merge_df.replace([np.inf, -np.inf], np.nan)


Null 값 제거



Null 값이 있는지 확인합니다.

dataset.isnull().values.any()


Null 값이 포함된 열을 확인합니다.

[col for col in dataset if dataset[col].isnull().values.any()]


얼마나 많은 Null 값 열이 포함되어 있는지 확인

dataset['FlowBytes/s'].isnull().sum()


Null 행의 수가 전체 데이터셋의 0.1% 미만이므로 데이터 손상 없이 모든 NULL 행을 안전하게 제거할 수 있습니다.

before = dataset.shape
dataset.dropna(inplace=True)
after = dataset.shape
print("No of removed rows: "+str(before[0] - after[0]))


레이블 인코딩



마지막으로 레이블을 인코딩할 것입니다. 즉, 각 레이블은 고유한 숫자로 표시됩니다. 이전에 논의된 이유는 기계 학습 모델이 많은 수치 계산을 포함하기 때문에 문자열/범주 기능과 잘 맞지 않습니다. 이것이 우리가 Label Encoding을 수행하는 이유입니다.

# Seperating labels from features
labels = merge_df[' Label']
print(labels)



# Labels have been replaced with integers.
LE = LabelEncoder()
LE.fit(labels)
encodedLabels = LE.transform(labels)
print(encodedLabels)



# Replacing string label with equivalent number labels
merge_df[' Label'] = LE.fit_transform(merge_df[' Label'])
merge_df.head()


열 이름 바꾸기




# Removing whitespaces in column names.
col_names = [col.replace(' ', '') for col in merge_df.columns]
merge_df.columns = col_names
merge_df.head(2)


향후 모델 교육을 위해 깨끗한 데이터 세트 저장




# Now we are saving dataset such that labels are encoded
dataset.to_csv(dataset_path+'processed/encodedDataset.csv', index=False)

좋은 웹페이지 즐겨찾기