AI/Machine Leaning

[Machine Learning] 선형회귀(linear regression) 예제

Sungwoo Koo 2022. 5. 12. 18:29

 

 

오늘 공부한 머신러닝 선형회귀를 캐글(Kaggle)의 dataset을 활용해 실습한 내용을 기록하기 위해 작성한 글이다

 

 


 

순서

Kaggle에서 연차-연봉 데이터셋(Salary)을 다운로드 받아 연차로부터 연봉을 예측하는 과정은 다음과 같다

 

1. 캐글(Kaggle) 환경 변수 설정 (os)

 

2. 데이터셋 다운로드

 

3. 데이터셋 로드 (pandas.load)

 

4. 데이터셋 크기 확인 (df.shape) * df : data frame

 

5. 데이터셋 그려서 살펴보기 (seaborn.pairplot)

 

6. 데이터셋 가공 [1] (np.array)

 

7. 데이터셋 가공 [2] (data.reshape)

 

8. 데이터셋 분할 (train_test_split)

 

9. 학습 (Sequental, Dense)

 

10. 검증 데이터로 예측하기 (matplotlib.pyplot.scatter)

 

 


 

 

1. 캐글(Kaggle) 환경 변수 설정 (os)
import os
os.environ['KAGGLE_USERNAME'] = 'username' 
os.environ['KAGGLE_KEY'] = 'key'

 

 

2. 데이터셋 다운로드

 

!kaggle datasets download -d rsadiq/salary

!unzip salary.zip

 

 

3. 데이터셋 로드 (pandas.load)

 

df = pd.read_csv('Salary.csv')
df.head(5) # 맨 앞에서 5줄을 출력 / df.tail(5) : 뒤에서 5줄 출력

 

csv 출력

 

 

4. 데이터셋 크기 확인 (df.shape) * df : data frame
print(df.shape) # df 의 모양을 살펴보는거 / 결과 : (200,4) 200개의 데이터셋이 있다는것

shape 출력

 

 

5. 데이터셋 그려서 살펴보기 (seaborn.pairplot)
# df (데이터프레임)을 통째로 넣은 다음 보고 싶은 variable를 뽑아서  Sales와의 관계를 보여달라는 의미
sns.pairplot(df, x_vars=['YearsExperience'], y_vars=['Salary'], height=4)

# 결과 : TV와 Sales와 상관관계가 높음을 그래프가 선형에 가깝다는 걸로 알 수 있음

pairplot 출력

 

 

6. 데이터셋 가공 [1] (np.array)
x_data = np.array(df[['YearsExperience']], dtype=np.float32) # Keras는 np.array 데이터만 취급하기 때문에 변환
y_data = np.array(df['Salary'], dtype=np.float32) # TensorFlow는 float32 dtype를 사용한다
# 결과 : x는 35,1인데 y는 35, 밖에없다 => 안맞다
print(x_data.shape)
print(y_data.shape)

shape 출력

 

 

7. 데이터셋 가공 [2] (data.reshape)
# numpy의 reshape를 사용해서 변환한다
# reshape((-1, 1)) : -1은 남은 수 만큼 알아서 변형해라는 뜻이고, 1은 뒤에는 1로 해라 는 뜻
x_data = x_data.reshape((-1,1))
y_data = y_data.reshape((-1,1))
print(x_data.shape)
print(y_data.shape)
# 결과 : 둘다 (35, 1)로 변환 (모양이 맞춰짐)

shape 출력

 

 

8. 데이터셋 분할 (train_test_split)
# 여기서는 학습, 검증 두개의 데이터셋으로 나누지만, 원래는 3개 (학습, 검증, 테스트)로 나눠야한다
# test_size = 0.2 : 20%를 테스트 셋으로 써라, 나머지 80%는 트레인셋으로 나눠줘라
x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021)
print(x_train.shape, x_val.shape)
print(y_train.shape, y_val.shape)
# 결과 : (28, 1) (7, 1) : 학습데이터는 28개 검증데이터는 7개라는 의미

shape

 

9. 학습 (Sequental, Dense)
#  Adam : SGD보다 성능이 좋아서 보편적으로 사용한다, lr : learning rate
model = Sequential([
  Dense(1) # 출력 1개 (Salary만 예측)                    
])



# Adam Optimizer
model.compile(loss='mean_squared_error', optimizer=Adam(lr=10000))

# SGD Optimizer
# model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.01))

model.fit(
    x_train,
    y_train,
    validation_data=(x_val, y_val),  # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
    epochs = 100 # 100 번 학습 반복
)

...

 

 

10. 검증 데이터로 예측하기 (matplotlib.pyplot.scatter)
y_pred = model.predict(x_val)

plt.scatter(x_val, y_val) # scatter : 점을 찍는 그래프
plt.scatter(x_val, y_pred, color='r') # y_pred : 예측값, 뒤의 color='r'로 인해 red 점이 찍힌다
plt.show()

scatter 출력