본문 바로가기
Daily Review

머신 러닝을 위한 데이터 전처리

by data-analyst-luke 2022. 8. 30.
반응형

데이터 전처리에는 데이터 준비, 통합, 정리, 정규화 및 데이터 변환이 포함됩니다. 및 데이터 축소 작업; 기능 선택, 인스턴스 선택, 이산화 등과 같은 데이터 전처리 작업의 안정적인 연결 후 예상되는 결과는 최종 데이터 세트이며, 이는 추가 데이터 마이닝 알고리즘에 정확하고 유용한 것으로 간주될 수 있습니다.

 

많은 실제 데이터 과학 활동에서 데이터 세트에는 범주형 변수가 포함됩니다. 이러한 변수는 일반적으로 다양한 특성을 나타내는 텍스트 값으로 저장됩니다. 값이 무엇에 사용되든 문제는 분석에서 이 데이터를 사용하는 방법을 결정하는 것입니다. 많은 기계 학습 알고리즘은 추가 조작 없이 범주형 값을 지원할 수 있지만 그렇지 않은 알고리즘이 더 많습니다. 따라서 분석가는 이러한 텍스트 속성을 추가 처리를 위해 숫자 값으로 변환하는 방법을 알아내야 하는 과제에 직면해 있습니다.

 

데이터 세트에 따라 레이블 인코딩과 하나의 핫 인코딩을 조합하여 추가 분석 요구 사항을 충족하는 이진 열을 생성할 수 있습니다. 이 예에서는 panda의 내장 get_dummy 함수를 사용하여 범주형 변수를 더미/지시자 변수로 변환합니다. 모델 구축 프로세스에 범주형 기능을 포함할 수 있으면 예측 정확도에 기여하는 정보를 추가할 수 있으므로 성능을 향상시킬 수 있습니다. 음악 데이터 프레임을 살펴보겠습니다.

 

 

# Create music_dummies
music_dummies = pd.get_dummies(music_df,drop_first =True)

# Print the new DataFrame's shape
print("Shape of music_dummies: {}".format(music_dummies.shape))
Shape of music_dummies: (1000, 20)

 

열에 10개의 값이 있었으므로 를 호출 하여 "genre" 9개의 새로운 열이 추가되었습니다. 원래 열을 삭제한 후에도 DataFrame에는 여전히 8개의 새 열이 있습니다. 이제 각 노래의 장르에 대한 이진 기능을 포함하는 을 만들었습니다 . 이제 노래 인기도를 예측하는 능선 회귀 모델을 구축할 차례입니다. 

 

# Create X and y
X = music_dummies.drop('popularity',axis=1).values
y = music_dummies['popularity'].values
kf = KFold(n_splits=5, random_state=42, shuffle=True)

# Instantiate a ridge model
ridge = Ridge(alpha = 0.2)

# Perform cross-validation
scores = cross_val_score(ridge, X, y, cv=kf, scoring="neg_mean_squared_error")

# Calculate RMSE
rmse = np.sqrt(-scores)
print("Average RMSE: {}".format(np.mean(rmse)))
print("Standard Deviation of the target array: {}".format(np.std(y)))
Average RMSE: 8.236853840202297 
Standard Deviation of the target array: 14.02156909907019

 

모델은 평균 RMSE를 계산하여 평가되지만 먼저 각 폴드의 점수를 양수 값으로 변환하고 제곱근을 취해야 합니다. 이 메트릭은 우리 모델 예측의 평균 오차를 보여주므로 목표 값의 표준 편차와 비교할 수 있습니다 "popularity". . 평균 RMSE는 대략 8.24목표 변수(노래 인기도)의 표준 편차보다 낮으므로 모델이 합리적임을 시사합니다.

 

실제 데이터에서는 속성에 결측값(MV)이 있기 때문에 데이터 마이닝에서 정보가 자주 손실됩니다. 이를 극복하기 위해 여러 가지 계획이 연구되었습니다. 그러한 결함이 있는 경우 지식 추출 프로세스에 유용하고 충분히 명확하게 하기 위해 일반적으로 데이터가 준비되고 정리되는 전처리 단계가 필요합니다. MV를 처리하는 가장 간단한 방법은 MV를 포함하는 예제를 버리는 것입니다. 그러나 이 방법은 데이터에 MV가 있는 비교적 적은 수의 예제가 포함되어 있고 완전한 예제의 분석이 데이터 마이닝 작업의 결측값에 의해 생성된 추론 ack 동안 심각한 편향으로 이어지지 않는 경우에만 실용적입니다. 가장 잘 알려진 것 중 하나는 공식적으로 전가라고 알려진 전처리를 기반으로 합니다.

 

# Print missing values for each column
print(music_df.isna().sum().sort_values())
genre                 8 
popularity           31 
loudness             44 
liveness             46 
tempo                46 
speechiness          59 
duration_ms          91 
instrumentalness     91 
danceability        143 
valence             143 
acousticness        200 
energy              200 
dtype: int64
# Print missing values for each column
print(music_df.isna().sum().sort_values())
# Remove values where less than 5% are missing
music_df = music_df.dropna(subset=['genre','popularity','loudness','liveness','tempo'])
popularity            0
liveness              0
loudness              0
tempo                 0
genre                 0
duration_ms          29
instrumentalness     29
speechiness          53
danceability        127
valence             127
acousticness        178
energy              178
dtype: int64

 

데이터 세트의 5% 미만을 차지하는 결측값을 삭제할 수 있습니다. 이제 "genre"열을 이진 기능으로 변환할 수 있습니다

 

# Print missing values for each column
print(music_df.isna().sum().sort_values())
# Remove values where less than 5% are missing
music_df = music_df.dropna(subset=["genre", "popularity", "loudness", "liveness", "tempo"])
# Convert genre to a binary feature
music_df["genre"] = np.where(music_df["genre"] == "Rock", 1, 0)
print(music_df.isna().sum().sort_values())
print("Shape of the `music_df`: {}".format(music_df.shape))
   popularity            0
    liveness              0
    loudness              0
    tempo                 0
    genre                 0
    duration_ms          29
    instrumentalness     29
    speechiness          53
    danceability        127
    valence             127
    acousticness        178
    energy              178
    dtype: int64
    Shape of the `music_df`: (892, 12)

 

데이터 세트는 1000개의 관측값에서 892개로 줄어들었지만 이제 이진 분류를 위한 올바른 형식이며 나머지 누락된 값은 파이프라인의 일부로 전가될 수 있습니다. 여기에는 각 기능에 대한 평균을 사용하여 누락된 값을 대치하고 노래 장르 분류를 위한 KNN 모델을 구축하는 단계가 포함됩니다.

 

# Import modules
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score, KFold, train_test_split
# Instantiate an imputer
imputer = SimpleImputer()
# Instantiate a knn model
knn = KNeighborsClassifier(n_neighbors=3)
# Build steps for the pipeline
steps = [("imputer", imputer), 
         ("knn", knn)]
# Create the pipeline
pipeline = Pipeline(steps)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,                                                    random_state=42)
# Fit the pipeline to the training data
pipeline.fit(X_train,y_train)
# Make predictions on the test set
y_pred = pipeline.predict(X_test)
# Print the confusion matrix
print(confusion_matrix(y_test, y_pred))
[[79  9]
 [ 4 82]]

 

따라서 파이프라인을 사용하여 모델 구축 워크플로를 확장할 수 있었습니다. 이 경우 혼동 행렬은 모델에 79개의 참 긍정과 82개의 참 부정이 있음을 강조합니다.

반응형

댓글