면접으로 정신 없던 주간을 지나서 이제 다시 여유로워진 주간이 오니 이것 저것에 눈이 돌아가기 시작했습니다.
그러던중 예전에 공부 하던 데이터 분석가? 관련된 책을 보다가 뭔가 데이터 분석가, 데이터 엔지니어, AI 엔지니어 등
위 3가지의 애매했던 일의 구분이 명확해졌습니다. 그래서 저 같은 경우 AI 를 매번 공부한다고 했지만 제대로 하지 않아서 말 그대로
기초만 알고 있기 때문에 이번 쉬는 기간에 제대로 배워 보자는 마음 가짐으로 다시 시작하게 되었습니다.
1. ML?
Machine learning 의 약자 입니다. 결국 머신 ( 컴퓨터 ) 가 배운다, 즉 학습 시킨다고 보는게 맞는거 같습니다.
2. ML 공부하기?
kaggle 에 들어가서 다른 것을 생략 하고 들어가면
https://www.kaggle.com/learn/intro-to-machine-learning
Learn Intro to Machine Learning Tutorials
Learn the core ideas in machine learning, and build your first models.
www.kaggle.com
이런 메뉴가 있습니다.
여기에서 배운 코드들을 정리하려고 이 글을 작성하게 되었습니다.
과정을 정리 하자면
CSV 데이터 불러오기 -> 데이터 안에 유효하지 않은 데이터 없애기 -> 예측 하고자 데이터 , 입력할 데이터 정리
-> 데이터 입력 -> 값 예측하기 -> 평가하기
3. 코드
DeicisionTree 를 이용한 값 예측
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
# 데이터 PATH
melbourene_file_path = './melb_data.csv'
# CSV 데이터 불러오기
melbourene_data = pd.read_csv(melbourene_file_path)
# 유효하지 않은 데이터 제거 하기
melbourene_data.dropna(axis=0)
# 사용할 데이터듸 feature 설정 하기
melbourene_feature = ['Rooms','Bathroom','Landsize','Lattitude','Longtitude']
X = melbourene_data[melbourene_feature]
y = melbourene_data.Price
# 학습 데이터 및 평가 데이터
train_X , val_X, train_y, val_y = train_test_split(X,y,random_state = 1)
# DecisionTree 모델 만들기
melbourene_model = DecisionTreeRegressor(random_state = 1 )
# 모델에 데이터 입력하기
melbourene_model.fit(train_X,train_y)
# 값 예측하기
val_predictions = melbourene_model.predict(val_X)
print("val prediction", val_predictions)
# 값 평가하기
mae = mean_absolute_error(val_y, val_predictions)
print("mae ",mae)
결과 값을 보면
val prediction [1900000. 500000. 1900000. ... 500000. 1900000. 500000.]
mae 529380.3835051546
차이가 많이 나는 것으로 보입니다.
하지만 Decision Tree 를 사용하는 경우 Overfitting , underfitting 이 발생하게 됩니다.
지나친 단순화로 인해 에러가 많이 발생하게 되면 Underfitting
너무 정확하게 표현하고자 하면 training data 에서는 정확하지만 실제에서는 에러가 나는 overfitting 이 발생하게 될 수 있습니다.
즉 best fit 를 찾아야 합니다.
그러면 다시 코드를 정리하게 되면
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
# 데이터 PATH
melbourene_file_path = './melb_data.csv'
# CSV 데이터 불러오기
melbourene_data = pd.read_csv(melbourene_file_path)
# 유효하지 않은 데이터 제거 하기
melbourene_data.dropna(axis=0)
# 사용할 데이터듸 feature 설정 하기
melbourene_feature = ['Rooms','Bathroom','Landsize','Lattitude','Longtitude']
X = melbourene_data[melbourene_feature]
y = melbourene_data.Price
# 학습 데이터 및 평가 데이터
train_X , val_X, train_y, val_y = train_test_split(X,y,random_state = 1)
# DecisionTree 모델 만들기
melbourene_model = DecisionTreeRegressor(random_state = 1 )
# 모델에 데이터 입력하기
melbourene_model.fit(train_X,train_y)
# 값 예측하기
val_predictions = melbourene_model.predict(val_X)
print("val prediction", val_predictions)
# mean absolute error 를 구하는 값
def get_mae_jin(max_leaf_nodes , train_X, val_X , train_y , val_y):
model = DecisionTreeRegressor(max_leaf_nodes = max_leaf_nodes, random_state=1)
model.fit(train_X, train_y)
preds_val = model.predict(val_X)
mae = mean_absolute_error(val_y, preds_val)
return (mae)
# 값 평가하기
for max_leaf_nodes in [5,10,50,100,200,300, 400, 500 , 600, 700, 800,1000, 2000]:
my_mae = get_mae_jin(max_leaf_nodes, train_X, val_X, train_y, val_y)
print("Max leaf nodes : %d \t\t Mean Absolute Error: %d" %(max_leaf_nodes, my_mae))
결과 값은
val prediction [2070000. 733000. 2810000. ... 1400000. 1260000. 493000.]
Max leaf nodes : 5 Mean Absolute Error: 356157
Max leaf nodes : 10 Mean Absolute Error: 311467
Max leaf nodes : 50 Mean Absolute Error: 264538
Max leaf nodes : 100 Mean Absolute Error: 243732
Max leaf nodes : 200 Mean Absolute Error: 232900
Max leaf nodes : 300 Mean Absolute Error: 226264
Max leaf nodes : 400 Mean Absolute Error: 222421
Max leaf nodes : 500 Mean Absolute Error: 221700
Max leaf nodes : 600 Mean Absolute Error: 221844
Max leaf nodes : 700 Mean Absolute Error: 219999
Max leaf nodes : 800 Mean Absolute Error: 219712
Max leaf nodes : 1000 Mean Absolute Error: 221085
Max leaf nodes : 2000 Mean Absolute Error: 228385
즉 best fit 은 800 언저리 라는 것을 알 수 있다.
5. random forrest
하지만 튜토리얼은 이러한 알고르즘 보다 성능이 좋은 random forest 로 모델을 변경해서 더 나은 성능을 보여줍니다.
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
# 데이터 PATH
melbourene_file_path = './melb_data.csv'
# CSV 데이터 불러오기
melbourene_data = pd.read_csv(melbourene_file_path)
# 유효하지 않은 데이터 제거 하기
melbourene_data.dropna(axis=0)
# 사용할 데이터듸 feature 설정 하기
melbourene_feature = ['Rooms','Bathroom','Landsize','Lattitude','Longtitude']
X = melbourene_data[melbourene_feature]
y = melbourene_data.Price
# 학습 데이터 및 평가 데이터
train_X , val_X, train_y, val_y = train_test_split(X,y,random_state = 1)
# RandomForest 모델 만들기
melbourene_model = RandomForestRegressor(random_state = 1 )
# 모델에 데이터 입력하기
melbourene_model.fit(train_X,train_y)
# 값 예측하기
val_predictions = melbourene_model.predict(val_X)
print("val prediction", val_predictions)
# 값 평가하기
mae = mean_absolute_error(val_y, val_predictions)
print("mae ",mae)
보시면 코드에서 크게 변한 부분은 없고 random forest 로 모델을 변경한 다음 다시 값을 예측 하는 식으로 했습니다.
결과 값은
val prediction [1876160. 819910. 2433025. ... 1307080. 1303615. 533375.]
mae 180544.06532524488
조금 더 오차가 줄어 든것을 확인 할 수 있습니다.
이처럼 간단하지만 빠르게 ml 튜토리얼을 진행해보았습니다.
간단하게 많은 것을 알 수 있어서 우선은 좋았던거 같습니다.
참고로 튜토리얼 7 강에서는 kaggle 에 competition 을 어떻게 접수하는지에 대해서 알 수 있습니다. 해당 부분도 확인 하셔서 같이 진행하시는 것도 좋다고 생각합니다.
또 다른 것을 배우게 되면 다시 포스팅 하겠습니다~
[참고자료]
[1] https://www.kaggle.com/learn/intro-to-machine-learning
[2] https://vitalflux.com/overfitting-underfitting-concepts-interview-questions/