scikit-learn을 사용하여 비즈니스 CSV 데이터를 One Hot Vector로 변환

소개



파이썬에서 기계 학습을 할 때 CSV에서 얻은 업무 데이터를 기계 학습에 적용하기 위해 One Hot Vector로 변환하는 것은 매우 당연한 일이라고 생각합니다.
그런데 의외로 넷에 샘플이 나오지 않았기 때문에, 스스로 조사한 결과를 비망록으로서 올려 둡니다.

전제



Watson Studio의 Jutyper Notebook에서 동작 검증 중입니다.
Watson Studio는 IBM Cloud에서 실행되는 Jupyter Notebook 환경이기도 합니다. (그 밖에도 다양한 것이 가능합니다)
관심이 있는 분은 10분 안에 가능한 Python 기계 학습 환경! Watson Studio 설정 가이드 에서 시험해 주세요.

이용 데이터



다운로드 에 공개된 데이터를 이용합니다.

Jupyter Notebook



아래에서 소개하는 코드는 Jupyter Notebook으로 github에서 다운로드할 수 있습니다.

구현 절차



대상 데이터를 DataFrame으로



다음 명령은 대상 데이터를 데이터 프레임에 로드합니다.
# 分析対象CSVのダウンロード
!wget https://github.com/MattyMc/is-a-tent/raw/master/GoSales_Tx_LogisticRegression.csv

# 分析対象データをDataFrameにロード
import pandas as pd
import numpy as np

df = pd.read_csv('GoSales_Tx_LogisticRegression.csv', header=0)
df.head()

결과는 다음과 같아야합니다.

IS_TENT 가 교사 데이터, GENDER , NARITAL_STATUS , PROFESSION 가 입력 데이터 중 One Hot화를 하고 싶은 항목이 됩니다. 이러한 항목을 다음 코드로 변환합니다.
먼저 시험에 항목 PROFESSION를 변환합니다.

개별 항목의 One Hot화


# One Hot化
from sklearn import preprocessing
from sklearn.preprocessing import OneHotEncoder

profession = df['PROFESSION'].values
profession_enc = preprocessing.LabelEncoder().fit_transform(profession).reshape(-1,1)
profession_enc2 = OneHotEncoder().fit_transform(profession_enc).toarray()

# 結果の確認をします
print(profession_enc[:5])
print(profession_enc2[:5])

다음과 같은 결과가 되어야 합니다.
[[3]
 [2]
 [2]
 [1]
 [5]]
[[ 0.  0.  0.  1.  0.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  1.  0.  0.  0.]]

profession_enc2의 단계에서 제대로 One Hot화되어 있는 것을 알았습니다.
다른 두 항목도 비슷한 처리를 합니다.
marital_status = df['MARITAL_STATUS'].values
marital_status_enc = preprocessing.LabelEncoder().fit_transform(marital_status).reshape(-1,1)
marital_status_enc2 = OneHotEncoder().fit_transform(marital_status_enc).toarray()

gender = df['GENDER'].values
gender_enc = preprocessing.LabelEncoder().fit_transform(gender).reshape(-1,1)
gender_enc2 = OneHotEncoder().fit_transform(gender_enc).toarray()

정수 데이터 표준화



항목 AGE 에 관해서는 원래는 정수치입니다만, 기계 학습 입력용으로 부동 소수점으로 변환 후, 표준화를 실시해 [0, 1] 의 범위에 값이 들어가게 합니다.
# AGEに関しては、浮動小数点に変換後、標準化します
from sklearn.preprocessing import MinMaxScaler
age = df['AGE'].values.reshape(-1, 1).astype(np.float32)
age_std = MinMaxScaler().fit_transform(age)

# 結果確認
print(age_std[:5])

print 문의 결과는 다음과 같아야합니다.
[[ 0.19230768]
 [ 0.4230769 ]
 [ 0.4230769 ]
 [ 0.75      ]
 [ 0.53846157]]

입력 행렬 만들기



지금까지의 모든 결과를 연결하여 기계 학습 입력 데이터를 만듭니다.
x = np.hstack([gender_enc2, age_std, marital_status_enc2, profession_enc2])
# 結果確認
pd.DataFrame(x).head()

결과는 다음과 같아야합니다.



교사 데이터 작성



마지막으로 교사 데이터에 대한 배열을 만듭니다.
# 教師データの作成
is_tent = df['IS_TENT'].values
y = preprocessing.LabelEncoder().fit_transform(is_tent).ravel()

# 結果確認
print(y[:5])
y.shape

아래와 같은 결과가 표시되면 OK입니다.
[0 0 0 0 0]
(60252,)

기계 학습 실시



이것으로 기계 학습에 대한 준비가 완료되었습니다.
다음은 어디까지나 참고로서의 기계 학습 실시 코드 샘플입니다.
# 以下はおまけです
from sklearn import svm
from sklearn.model_selection import train_test_split

# 訓練データと検証データ取得
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

# モデル作成
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=1.0)

# 学習
lr.fit(x_train, y_train)

# 検証データで予測
y_pred = lr.predict(x_test)
lr.score(x_test, y_test)

좋은 웹페이지 즐겨찾기