Hseong

[KT AIVLE SCHOOL 7기] - 머신러닝(1) 회귀 본문

KT AIVLE SCHOOL 7기

[KT AIVLE SCHOOL 7기] - 머신러닝(1) 회귀

__hseong__ 2025. 4. 8. 19:19
728x90
반응형

오늘은 그동안 배운 파이썬 기본 + 시각화를 기반으로 본격적으로 머신러닝과 그를 위한 초석을 다지는 이론을 정리하는 시간이다!

데이터 확인 및 이해

# 데이터 읽어오기
path = 'https://raw.githubusercontent.com/Jangrae/csv/master/airquality_simple.csv'
data = pd.read_csv(path)

# 상위 몇 개 행 확인
data.head()

해당 데이터는 공기의 여러 요소들에 대한 데이터이다! 그 전에 변수와 기술 통계를 보기 위해 아래와 같은 구문을 사용한다

# 변수 확인
data.info()

# 기술통계 확인
data.describe()

  • 데이터에 대해서 설명하면 info()를 통해서 각 변수들의 자료형과 결측치가 있는지 확인 가능하다! 머신러닝에 있어서 결측치는 앞으로 여러 평가를 하는데에 중요하기 때문에 사전 확인 필요하다 꼭이다!!
  • 그리고 여러 1,2,3 분위수와 평균 그리고 중위수를 보기 위해 기술 통계 구문인 describe()를 통해 데이터의 구조(분포)를 알아본다!
# Target 변수 값 분포 확인
plt.figure(figsize=(8, 5))
plt.subplot(2, 1, 1)
plt.hist(data['Ozone'], bins=30, alpha=0.7, ec='black')
plt.subplot(2, 1, 2)
plt.boxplot(data['Ozone'], vert=False)
plt.show()

  • subplot을 이용하여 2행 1열로 표현하고, figure(figsize=()) 구문으로 사이즈를 조절한다
  • 그리고 각 histplot 과 boxplot으로 시각화를 간단하게 시킨다 여기서 vert=False 를 주어서 x축과 평행하도록 보기 좋게 보여준다!
# 상관관계 확인
data.corr(numeric_only=True)

다음은 상관관계를 확인해본다! 이는 -1~+1 사이의 값을 갖는데 0과 가까울수록 아무런 관련이 없다고 보면된다!

그래서 -1,+1과 가까울수록 강한 음,양의 상관관계를 가지므로 -1과 가깝다고해서 해당 요인을 빼버린다면 프로젝트 때 실수를 할 것 같아서 다시 헷갈릴까봐 블로그에 남기려고 했다 (사실 아직 초보라서 중요성을 모름..미안해 미래 팀원분들..)

# 상관관계 시각화
plt.figure(figsize=(8, 5))
sns.heatmap(data.corr(numeric_only=True),
            annot=True,
            cmap='Blues',
            fmt='.2f',
            cbar=False,
            square=True,
            annot_kws={'size': 8})
plt.show()

# kwargs: Keyword Arguments

seaborn에 다채로운 heatmap을 통해 해당 상관관계를 시각화 시켰다! 당연히 n,n칸은 동일하므로 1이다!

# Temp --> Ozone 상관관계
plt.figure(figsize=(8, 5))
plt.scatter(data['Temp'], data['Ozone'])
plt.show()

  • 다음은 온도와 오존의 상관관계를 시각화 시키기 위해 해당 구문을 썼다. heatmap과 상관관계를 보면 오존과 온도는 무려 0.68로 확인해 볼만하다!
  • 결과가 위와 같이 나왔는데 뭔가 1차 함수로 그리고 싶게 생기지 않았을까??(물론 내 생각임..)

데이터 준비 (전처리)

이제 데이터를 이해하고 준비를 했으므로 본격적으로 머신러닝을 위한 중요한 작업인 전처리를 진행한다!

# 결측치 확인
data.isnull().sum()
# 전날 값으로 결측치 채우기
data.ffill(inplace=True)

# 확인
data.isnull().sum()

  • 여기서 보면 insnull().sum() 을 통해서 각 column마다 결측치의 갯수를 확인할 수 있다.
  • 그리고 ffill이라는 것은 결측치 기준 앞에 있는 값으로 해당 값을 채운다는 뜻이고, inplace=True는 원래 데이터 프레임의 해당 변경 사항을 반영한다는 뜻이다!
  • 그래서 잘됐는지 다시 결측치를 확인하면 두 번째 그림과 같이 결측치가 사라진 것을 확인 가능하다!
# 변수 제거
drop_cols = ['Month', 'Day']
data.drop(columns=drop_cols, inplace=True)

# 확인
data.head()

  • 여기서 아까 확인해본 상관관계를 통해서 의미가 없다고 생각하는 요인들(0과 가까운 상관관계를 갖는 녀석들)을 위주로 변수를 drop 문을 통해 제거한다!
  • 그리고 데이터를 확인해보면 위 그림과 같이 제거되는 것을 볼 수 있다!
# target 확인
target = 'Ozone'

# 데이터 분리
x = data.drop(target, axis=1)
y = data.loc[:, target]

  • 그리고 머신러닝 전에 중요하게 알아두어야할게 있다! 데이터(영향을 주는 요인)을 columns에서 선택하여 X에 넣어주고, 최종적으로 도출할 가설의 결과인 변수를 Y에 최종적으로 넣어야한다! 
  • 현재 하고있는 것은 이중,다중 분류가 아닌 단일변수에 대한 머신러닝이라서 위 그림처럼 데이터를 나누려고한다!
  • drop 문을 통해서 target이 오존이므로 axis=1을 통해 열을 명시하여 해당 데이터를 제외한 나머지 데이터를 x에 넣고, target인 오존은 loc 구문을 통해 행을 전체로, 열은 오존만 인덱싱하여 y에 넣어준다!
  • 근데 이걸 일일히 train,test 세트를 나누려면 번거로우니 sklearn을 사용하여 딸깍! 해준다
# 모듈 불러오기
from sklearn.model_selection import train_test_split

# 7:3으로 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)  # test_size default=0.25
  • 여기서 sklearn.model_selection에 train_test_split을 통해서 자동으로 나누어주는데 몇 가지 볼 변수들이 있다
  • train : test = 7 : 3 비율로 나누기 위해 test_size를 정의해주고, randon_state는 1,2,42 등으로 설정해서 분할로 데이터를 섞을 때 무작위로 섞는 비율이라 일단은 1로 했다!

모델링 ( ML )

# 1단계: 불러오기
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
# 2단계: 선언하기
model = LinearRegression()
# 3단계: 학습하기
model.fit(x_train, y_train)
# 4단계: 예측하기
y_pred = model.predict(x_test)
# 5단계: 평가하기
print(mean_absolute_error(y_test, y_pred))
  1. 먼저 선형 회귀를 위해서 LinearRegression 을 가져오고 , 평가요소로 metrics에서 mae 라는 평균절대오차를 이용한다.
  2. model 을 선형회귀로 설정하고, 학습을 위해 기존에 나누었던 데이터셋을 통해서 fit을 통해 학습한다.
  3. 그리고 학습된 모델을 x_test 의 데이터를 이용하여 예측하고, 이를 y_test값과 예측값을 비교하여 평가 한다!

# 예측값, 실젯값 확인
print(y_pred[:10])
print('-' * 72)
print(y_test.values[:10])

# 예측값, 실젯값 시각화 비교
plt.figure(figsize=(8, 5))
plt.plot(y_pred, label='Predicted')
plt.plot(y_test.values, label='Actual')
plt.legend()
plt.show()

  • 결과를 살펴본다면 어느정도 예측값과 실제값이 일치하는 경향을 보이기도 하지만 특정 구간은 차이가 나는 경우가 있다! 
  • 이것은 앞으로 배울 여러 튜닝과 여러 모델을 사용한다면 오류를 최소화 시킬 수는 있다!
  • 수치들을 본다면 거의 비슷하게 모델이 예측한 것을 알 수 있다
728x90
반응형