Intro to Machine Learning - 03. Your First Machine Learning Model

d2n0s4urΒ·2023λ…„ 1μ›” 29일
0

πŸ“– Tutorial


Selecting Data for Modeling

μ—¬λŸ¬λΆ„μ˜ 데이터셋은 λ©‹μ§€κ²Œ 좜λ ₯ν•˜κΈ°μ—λŠ”, 머리λ₯Ό κ°μŒ€ μ •λ„λ‘œ λ§Žμ€ λ³€μˆ˜λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. μ–΄λ–»κ²Œ ν•˜λ©΄ 이 μ—„μ²­λ‚œ μ–‘μ˜ 데이터λ₯Ό 이해할 수 μžˆλŠ” μˆ˜μ€€μœΌλ‘œ 쀄일 수 μžˆμ„κΉŒμš”?

μš°λ¦¬λŠ” 직관을 μ‚¬μš©ν•˜μ—¬ λͺ‡ 가지 λ³€μˆ˜λ₯Ό μ„ νƒν•˜λŠ” κ²ƒμœΌλ‘œ μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€. 이 ν›„ κ³Όμ •μ—μ„œλŠ” λ³€μˆ˜μ˜ μš°μ„ μˆœμœ„λ₯Ό μžλ™μœΌλ‘œ μ§€μ •ν•˜λŠ” 톡계 기법을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ³€μˆ˜μ™€ 열을 μ„ νƒν•˜κΈ° μœ„ν•΄μ„œλŠ”, μš°μ„  λ°μ΄ν„°μ…‹μ˜ λͺ¨λ“  μ—΄ λͺ©λ‘μ„ 확인해야 ν•©λ‹ˆλ‹€. 이 μž‘μ—…μ€ DataFrame의 columns 속성(μ•„λž˜ μ½”λ“œμ˜ 맨 μ•„λž« 쀄)으둜 μ‹€ν–‰λ©λ‹ˆλ‹€.

import pandas as pd

melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
melbourne_data.columns

# Melbourne data은 λͺ‡λͺ‡ 결츑값이 μ‘΄μž¬ν•¨ (λͺ‡λͺ‡ 주택에 λͺ‡λͺ‡ 값이 κΈ°λ‘λ˜μ§€ μ•ŠμŒ)
# 이 ν›„ νŠœν† λ¦¬μ–Όμ—μ„œ 결츑값을 μ²˜λ¦¬ν•˜λŠ” 방법을 배울 μ˜ˆμ •
# μ—¬λŸ¬λΆ„μ΄ μ‚¬μš©ν•˜λŠ” Iowa data의  μ—΄μ—λŠ” 결츑값이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ
# λ”°λΌμ„œ κ°€μž₯ κ°„λ‹¨ν•œ μ˜΅μ…˜μ„ μ‚¬μš©ν•  것이며, μ΄λŠ” 우리 λ°μ΄ν„°μ—μ„œ 값을 λ“œλ‘­ν•  κ²ƒμž„.
# μ§€κΈˆ λ‹Ήμž₯은 κ±±μ •ν•˜μ§€ 말고, λ‹€μŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ„λ‘ ν•˜μž:

# dropnaλŠ” 결츑값을 μ œκ±°ν•œλ‹€. (naλ₯Ό "μ‚¬μš© λΆˆκ°€λŠ₯"으둜 생각)
melbourne_data = melbourne_data.dropna(axis=0)

λ°μ΄ν„°μ˜ ν•˜μœ„ 집합을 μ„ νƒν•˜λŠ” 방법은 μ—¬λŸ¬ 가지가 μžˆμŠ΅λ‹ˆλ‹€. νŒλ‹€μ™€ κ΄€λ ¨λœ κ°•μ˜μ—μ„œλŠ” 이에 λŒ€ν•΄ 쑰금 더 μžμ„Ένžˆ λ‹€λ£¨μ§€λ§Œ, μ§€κΈˆμ€ 두 가지 접근법에 μ΄ˆμ μ„ 맞좜 κ²ƒμž…λ‹ˆλ‹€.

  1. 점 ν‘œκΈ°λ²•: "예츑 λŒ€μƒ"을 μ„ νƒν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€.
  2. μ—΄ λͺ©λ‘ 선택: "νŠΉμ„±"을 μ„ νƒν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€.

Selecting The Prediction Target

μ—¬λŸ¬λΆ„μ€ 점 ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό μΆ”μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 ν•˜λ‚˜μ˜ 열은 DataFrameκ³Ό μœ μ‚¬ν•œ Series 자료ꡬ쑰둜 μ €μž₯λ©λ‹ˆλ‹€.

점 ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•˜μ—¬ μ˜ˆμΈ‘ν•  열을 μ„ νƒν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ„ νƒν•œ 열을 prediction target이라고 ν•©λ‹ˆλ‹€. 일반적으둜, prediction target을 y둜 μ§€μ •ν•©λ‹ˆλ‹€. Melbourne dataμ—μ„œ 주택 가격λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

y = melbourne_data.Price

Choosing "Features"

λͺ¨λΈμ— μž…λ ₯되고 λ‚˜μ€‘μ— μ˜ˆμΈ‘ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 열을 "features"라고 ν•©λ‹ˆλ‹€. 우리의 경우, 주택 가격을 κ²°μ •ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 열이 될 κ²ƒμž…λ‹ˆλ‹€. 가끔, prediction target을 μ œμ™Έν•œ λͺ¨λ“  열이 feature둜 μ‚¬μš©λ˜λŠ” κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€. λ•Œλ‘œλŠ” 적은 featureλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 λ‚˜μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ§€κΈˆμ€ λͺ‡κ°€μ§€ features만 μ‚¬μš©ν•˜λŠ” λͺ¨λΈμ„ λ§Œλ“€λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. λ‚˜μ€‘μ— μ—¬λŸ¬λΆ„μ€ λ‹€μ–‘ν•œ features둜 μ œμž‘λœ λͺ¨λΈμ„ λΉ„κ΅ν•˜λŠ” 방법을 μ•Œ 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

κ΄„ν˜Έ μ•ˆμ— μ—΄ μ΄λ¦„μ˜ 리슀트λ₯Ό μž‘μ„±ν•˜μ—¬ μ—¬λŸ¬ featuresλ₯Ό 선택할 수 μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή ν•­λͺ©μ€ λ”°μ˜΄ν‘œμ— 감싸진 λ¬Έμžμ—΄μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ μ˜ˆμ‹œμž…λ‹ˆλ‹€:

melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']

일반적으둜, 이 데이터λ₯Ό X 라고 ν•©λ‹ˆλ‹€.

X = melbourne_data[melbourne_features]

이제 describe와 head λ©”μ†Œλ“œλ₯Ό 톡해 주택 가격을 μ˜ˆμΈ‘ν•˜λŠ” 데 μ‚¬μš©ν•  데이터λ₯Ό λΉ λ₯΄κ²Œ 검토해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

X.describe()
X.head()

μ΄λŸ¬ν•œ λͺ…령을 μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ‹œκ°μ μœΌλ‘œ ν™•μΈν•˜λŠ” 것은 데이터 κ³Όν•™μžμ˜ μž‘μ—…μ—μ„œ μ€‘μš”ν•œ λΆ€λΆ„μž…λ‹ˆλ‹€. λ°μ΄ν„°μ…‹μ—μ„œ 좔가적인 ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•  κ°€μΉ˜κ°€ μžˆλŠ” μ˜λ―ΈμžˆλŠ” 값을 자주 λ°œκ²¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.



Building Your Model

μ—¬λŸ¬λΆ„μ€ scikit-learn 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λΈμ„ λ§Œλ“€ μ˜ˆμ •μž…λ‹ˆλ‹€. μƒ˜ν”Œ μ½”λ“œμ—μ„œ λ³Ό 수 μžˆλŠ” 것 처럼 이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” sklearn 으둜 μž‘μ„±λ©λ‹ˆλ‹€. scikit-learn λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 일반적으둜 DataFrame에 μ €μž₯된 λ°μ΄ν„°μ˜ μœ ν˜•μ„ λͺ¨λΈλ§ν•˜λŠ” 데 κ°€μž₯ 널리 μ‚¬μš©λ˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.

λͺ¨λΈμ„ λ§Œλ“€κ³  μ‚¬μš©ν•˜λŠ” λ‹¨κ³„λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • Define: μ–΄λ–€ μœ ν˜•μ˜ λͺ¨λΈμ΄ ν•„μš”ν•œμ§€ μ§€μ •ν•œλ‹€. μ˜μ‚¬κ²°μ • νŠΈλ¦¬μΈμ§€ λ‹€λ₯Έ μœ ν˜•μ˜ λͺ¨λΈμΈμ§€ μ •ν•΄μ•Ό ν•œλ‹€. λͺ¨λΈ μœ ν˜•μ˜ λ‹€λ₯Έ 일뢀 맀개 λ³€μˆ˜λ„ 같이 μ§€μ •λœλ‹€.
  • Fit: 제곡된 λ°μ΄ν„°μ—μ„œ νŒ¨ν„΄μ„ μΆ”μΆœν•œλ‹€. μ΄λŠ” λͺ¨λΈλ§μ˜ 핡심이닀.
  • Predict: 말 κ·ΈλŒ€λ‘œ 예츑
  • Evaluate: λͺ¨λΈμ˜ 예츑 정도가 μ–΄λŠμ •λ„ λ˜λŠ”μ§€ κ²°μ •ν•œλ‹€.

λ‹€μŒμ€ scikit-learn 라이브러리λ₯Ό ν™œμš©ν•˜μ—¬ μ˜μ‚¬κ²°μ • 트리 λͺ¨λΈμ„ μ •μ˜ν•˜κ³  target variableκ³Ό feature둜 ν”ΌνŒ…ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

from sklearn.tree import DecisionTreeRegressor

# λͺ¨λΈμ„ μ •μ˜. random_state에 숫자λ₯Ό μ§€μ •ν•˜μ—¬ μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ λ™μΌν•œ κ²°κ³Όλ₯Ό 보μž₯
melbourne_model = DecisionTreeRegressor(random_state=1)

# λͺ¨λΈ Fitting
melbourne_model.fit(X, y)

λ§Žμ€ 기계 ν•™μŠ΅ λͺ¨λΈμ€ λͺ¨λΈ ν›ˆλ ¨μ—μ„œ μ•½κ°„μ˜ λ¬΄μž‘μœ„μ„±μ„ ν—ˆμš©ν•©λ‹ˆλ‹€. random_state에 숫자λ₯Ό μ§€μ •ν•˜λ©΄ 각 runμ—μ„œ λ™μΌν•œ κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 쒋은 κ΄€ν–‰μœΌλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€. μž„μ˜μ˜ 숫자λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή 값에 따라 λͺ¨λΈμ˜ ν’ˆμ§ˆμ΄ 크게 달라지지 μ•ŠμŠ΅λ‹ˆλ‹€.

이제 μ˜ˆμΈ‘ν•˜λŠ”λ° μ‚¬μš©ν•  수 μžˆλŠ” ν”ΌνŒ… λͺ¨λΈμ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

μ—°μŠ΅μ—μ„œ, μ—¬λŸ¬λΆ„μ€ 이미 가격이 μ±…μ •λœ μ£Όνƒλ³΄λ‹€λŠ” μ‹œμž₯에 λ‚˜μ˜¬ μƒˆλ‘œμš΄ 주택에 λŒ€ν•œ μ˜ˆμΈ‘μ„ ν•˜κ³  싢을 κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, μ—¬κΈ°μ—μ„œλŠ” 예츑 ν•¨μˆ˜κ°€ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ 보기 μœ„ν•΄μ„œ ν•™μŠ΅λ°μ΄ν„°μ˜ 처음 λͺ‡ 행에 λŒ€ν•œ μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•  κ²ƒμž…λ‹ˆλ‹€.

print("λ‹€μŒ 5개 주택에 λŒ€ν•œ μ˜ˆμΈ‘μ„ 진행할 κ²ƒμž…λ‹ˆλ‹€:")
print(X.head())
print("예츑 값은:")
print(melbourne_model.predict(X.head()))

Your Turn

μ—¬κΈ°μ—μ„œ μ—¬λŸ¬λΆ„ 슀슀둜 예제λ₯Ό μˆ˜ν–‰ν•˜μ‹­μ‹œμ˜€.

0개의 λŒ“κΈ€