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줄 출력
4. 데이터셋 크기 확인 (df.shape) * df : data frame
print(df.shape) # df 의 모양을 살펴보는거 / 결과 : (200,4) 200개의 데이터셋이 있다는것
5. 데이터셋 그려서 살펴보기 (seaborn.pairplot)
# df (데이터프레임)을 통째로 넣은 다음 보고 싶은 variable를 뽑아서 Sales와의 관계를 보여달라는 의미
sns.pairplot(df, x_vars=['YearsExperience'], y_vars=['Salary'], height=4)
# 결과 : TV와 Sales와 상관관계가 높음을 그래프가 선형에 가깝다는 걸로 알 수 있음
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)
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)로 변환 (모양이 맞춰짐)
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개라는 의미
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()