Python의 머신러닝 구현(데이터 전처리)

절차

Python으로 구현하는 절차는 사람마다 다를 수 있지만 일반적으로 머신러닝 프로젝트의 일부로 간주되는 전체 프로세스에 대해 설명합니다. 현재 진행중인 작업을 추적하는데 도움이되는 프로세스 프레임워크가 많이 있지만 다음과 같은 작업을 단순화 해 보겠습니다.

  • 데이터 가져 오기

  • 데이터 준비 및 전처리

  • 모델 만들기

  • 결과 해석

실제 절차는 진행이 될 수록 확장 할 수 있습니다. 그러나 지금 설명하는 절차는 간단한 머신러닝 프로세스 프레임워크입니다. 또한 “파이프라인”은 워크플로우 기능을 함께 연결하는 기능을 의미하므로 앞으로 이를 염두에 두어야합니다.

데이터 가져 오기

모델을 구축하기 전에 데이터가 필요하며 이 데이터가 합당한 기대치를 충족하는지 확인해야 합니다. 테스트 목적으로 (학습/테스트의 의미가 아니라 인프라를 테스트하기 위해) 여기에서 다운로드 할 수 있는 아이리스(붓꽃) 데이터세트를 사용합니다 . 다양한 버전의 데이터세트를 온라인에서 찾을 수 있기는 하지만 아래의 절차를 따라서 연습하기 위해 동일한 원시 데이터에서 시작하는 것을 권장합니다.

ml-pipelines-1-1.py —————————-

import pandas as pd

df = pd.read_csv(‘iris.csv’)

df.head()


 

 

이러한 간단한 데이터세트와 파일에 대해 알면, 원시 데이터에서 결과로 이동하기 위해서 해야 ​​할 일이 무엇인지 생각해 보겠습니다.

  • 데이터는 CSV 파일에 저장됩니다.

  • 인스턴스는 주로 숫자 속성 값으로 구성됩니다.

  • 클래스는 범주형 텍스트입니다.

위의 내용 중 어느 것도 모든 데이터 집합에 보편적이라고 할 수 없지만 이 데이터세트에만 해당되는 것도 아닙니다 . 나중에 우리가 재사용 할 수있는 코드를 작성할 기회를 제공합니다. 여기에서 초점을 맞출 좋은 코딩 방법은 재사용 가능성과 모듈성을 모두 포함합니다.

몇 가지 간단한 탐색 데이터 분석은 다음과 같습니다.

 

데이터 전처리

이 특정 시나리오에서 필요한 데이터 준비는 사소하지만 여전히 필요한 부분이 있습니다. 특히 헤더의 행을 고려하고 pandas가 자동으로 수행하는 색인을 제거하고 클래스 값을 nominal에서 numeric로 변환해야합니다. 우리가 모델링에 사용할 피처에는 nominal value가 없기 때문에 적어도 더 이상 복잡한 변환이 필요하지 않습니다.

궁극적으로 알고리즘에 대한 더 나은 데이터 표현이 필요하기 때문에 계속 진행하기 전에 행렬 또는 numpy ndarray로 끝날 것입니다. 데이터 준비 워크플로우는 다음과 같은 형식을 취해야합니다.

 

 

모든 데이터가 지금처럼 쉼표로 구분된 파일로 저장된다고 생각할 수는 없습니다.  SQL 데이터베이스나 웹에서 직접 데이터를 가져올 수도 있습니다.

먼저 CSV 파일을 DataFrame에 로드하는 간단한 함수를 작성해 보겠습니다. 인라인 작업은 간단하지만 앞으로는 데이터세트 로딩 함수에 몇 가지 단계를 추가 할 수 있습니다.

ml-pipelines-1-2.py———————————————————-

import pandas as pd

def load_dataset(filename, filetype=’csv’, header=True):

”’

Loads a dataset from file

Parameters:

———–

filename: str

Name of data file

filetype: str

The type of data file (csv, tsv)

Returns:

——–

DataFrame

Dataset as pandas DataFrame

”’

in_file = open(filename)

data = []

header_row = ”

# Read the file line by line into instance structure

for line in in_file.readlines():

# Skip comments

if not line.startswith(“#”):

# TSV file

if filetype == ‘tsv’:

if header:

header_row = line.strip().split(‘\t’)

else:

raw = line.strip().split(‘\t’)

# CSV file

elif filetype ==’csv’:

if header:

header_row = line.strip().split(‘,’)

else:

raw = line.strip().split(‘,’)

# Neither = problem

else:

print ‘Invalid file type’

exit()

# Append to dataset appropriately

if not header:

data.append(raw)

header = False

# Build a new dataframe of the data instance list of lists and return

df = pd.DataFrame(data, columns=header_row)

return df

——————————————————————————————

이 코드는 아주 간단합니다. 데이터 파일을 한 라인씩 읽으면서 데이터가 아닌 라인을 무시하는 것과 같은 몇가지 추가 사전 처리가 가능합니다 (데이터 파일의 주석은 현재 ‘#’로 시작한다고 가정하고 있지만 다른 경우에는 꼭 그렇지 않을 수 있습니다). 데이터 세트 파일에 헤더가 포함되는지 여부를 지정할 수 있으며 CSV 및 TSV 파일을 모두 허용하며 CSV가 기본값입니다.

약간의 오류 검사가 존재하지만 아직 완벽하지는 않습니다. 따라서 나중에 다시 돌아가고 싶을 수도 있습니다. 또한 한 라인씩 파일을 읽고 읽은 라인을 하나씩 처리하는 방법을 결정할 때 기본 제공 기능을 사용하여 깨끗한 CSV를 DataFrame으로 직접 읽는 것보다 속도가 느려지지만 더 많은 것을 허용하도록 조절해야합니다. 이 단계에서는 유연성이 그만한 가치가 있습니다 (그러나 더 큰 파일의 경우 상당히 오래 걸릴 수 있습니다). 이러한 내부 작업 중 일부가 최선의 접근 방식으로 보이지 않는 경우 나중에 언제든지 변경할 수 있다는 점을 기얼하세요.

코드를 시험해보기 전에 먼저 nominal class value를 numeric value로 변환하는 함수를 작성해야합니다. 함수를 일반화하려면 클래스뿐만 아니라 데이터 집합의 모든 특성에 함수를 사용할 수있게 해야 합니다. 우리는 또한 integer가 끝나는 것에 대한 속성 이름의 매핑을 추적해야 합니다. CSV 또는 TSV 데이터 파일을 팬더 DataFrames에로드하는 이전 단계에서이 함수는 pandas의 DataFrame과 numeric으로 변환할 attribute name을 모두 받아 들여야합니다.

또한 범주화되지 않은 클래스 속성과 관련하여 일회용 인코딩을 사용하는 것에 대한 설명을 않하고 있지만 나중에 다시 돌아올 것입니다.

ml-pipelines-1-3.py———————————————————————

def to_numeric(dataset, attr_name):

”’

Performs a simple categorical to numeric attribute value transformation

Parameters:

———–

dataset: DataFrame

Dataset on which to perform transformation

attr_name: str

Dataset attribute name to convert from nominal to numeric values

Returns:

——–

DataFrame

DataFrame of with data transformation performed

dict

Python dictionary of attribute name to integer mappings

”’

# Get unique entries in column

unique_vals = dataset[attr_name].unique()

# Create dict

val_dict = {}

for val in unique_vals:

if not val in val_dict:

val_dict[val] = len(val_dict)

# Replace values in attr_name col as per dict

dataset[attr_name].replace(val_dict, inplace=True)

# Return dataset and value dictionary

return dataset, val_dict

—————————————————————————————————–

위의 함수는 간단하지만 우리가 원하는 것을 해냅니다. 우리는 pandas가 내장된 기능을 사용하는 것을 포함하여 여러 가지 다른 방법으로 이 작업에 접근 할 수 있었지만, 우리가 직접 코딩한 것은 이것이 전부입니다.

이제 파일에서 데이터세트를 로드하고 categorical attribute value를 numeric value로 대체 할 수 있습니다 (우리는 또한 나중에 해당 맵핑 사전을 보관합니다). 앞에서 언급했듯이 우리의 알고리즘에서 가장 쉽게 사용할 수 있도록 데이터세트를 궁극적으로 numpy ndarray 형태로 제공합니다. 다시 한번 말하지만, 간단한 작업이지만, 그것을 함수로 만들면 나중에 필요에 따라 빌드 할 수 있습니다.

ml-pipelines-1-4.py—————————————————————-

import numpy as np

def to_matrix(dataset):

”’

Converts a pandas DataFrame dataset to a numpy matrix representation

Parameters:

———–

dataset: DataFrame

Dataset to convert to matrix representation

Returns:

——–

ndarray

numpy ndarray representation of dataset

”’

return dataset.as_matrix()

————————————————————————————————–

앞서 언급 한 함수들 중 어느 하나라도 어렵다고 생각되지 않더라도 이 기능이 제대로 작동하지 않을 수 있습니다. 그러나 우리는 실제로 지나치게 신중하게 프로그래밍 원칙을 따르고 있습니다. 우리가 지금까지 구현한 기능에 변화를 주거나 추가 할 것을 제안 할 수있는 좋은 기회가 있습니다. 이러한 변경 사항을 한 곳에서 구현할 수 있고 이러한 변경 사항을 잘 문서화하면 장기적으로 가치가 있을 것입니다.

데이터 전처리 테스트

워크플로우를 아직까지는 블록 형식으로 만들지만, 코드를 테스트 해보겠습니다.

ml-pipelines-1-5.py—————————————–

# Load dataset

data = load_dataset(‘iris.csv’)

print data.head()

# Change categorical class names to numeric values

data, data_dict = to_numeric(data, ‘species’)

print data.head()

print data_dict

# Convert dataset to matrix representation

ds = to_matrix(data)

print ds[:10]


 

 

우리가 원했던대로 코드가 작동하면 바로 정리를 하보겠습니다. 우리가 지금까지 한 작업을 하나의 파일인 dataset.py로 정리하고, 이 파일에 모든기능을 추가합니다음에 편리하게 재사용 할 수 있습니다.

다음 연습은

다음으로, k-means 클러스터링 알고리즘의 구현과 같은 더 큰 실체에 집중할 것입니다. 그런 다음 k- 최근접 이웃(kNN)에 대한 간단한 분류 알고리즘을 살펴 보겠습니다. 간단한 워크플로우의 컨텍스트에서 분류 및 클러스터링 모델을 모두 구축 할 수있는 방법을 알아 봅니다. 이러기 위해 프로젝트를 돕기위한 몇 가지 추가 도구를 코딩해야 할 것이며, 우리가 이미 한 일에 수정이 필요할 것 입니다.

출처 : http://www.kdnuggets.com/2017/05/machine-learning-workflows-python-scratch-part-1.html?utm_content=buffer47f18&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer