도순씨의 코딩일지

딥러닝 :: 선형 회귀 적용하기 본문

지금까지 예로 들었던 데이터들은 참(1) 또는 거짓(0)을 맞히는 문제, 아니면 여러 개의 보기 중 맞는 하나를 예측하는 문제였다. 이번에는 정답을 맞히는 것이 아닌 수치를 예측하는 모델을 만들어보도록 하자.

 

@ 데이터는 https://github.com/gilbutITbook/006958 여기서 다운로드 받으실 수 있습니다.

 

 

1. 데이터 확인하기


먼저 데이터를 확인해보자.

 

@ 코드

1
2
3
4
import pandas as pd
 
df = pd.read_csv("/Users/hansubin/Downloads/006958-master/deeplearning/dataset/housing.csv", delim_whitespace = True, header = None)
print(df.info())
cs

delim_whitespace = True는 공백으로 구분된 파일을 읽을 때 사용한다.

 

@실행 결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
RangeIndex: 506 entries, 0 to 505
Data columns (total 14 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   0       506 non-null    float64
 1   1       506 non-null    float64
 2   2       506 non-null    float64
 3   3       506 non-null    int64  
 4   4       506 non-null    float64
 5   5       506 non-null    float64
 6   6       506 non-null    float64
 7   7       506 non-null    float64
 8   8       506 non-null    int64  
 9   9       506 non-null    float64
 10  10      506 non-null    float64
 11  11      506 non-null    float64
 12  12      506 non-null    float64
 13  13      506 non-null    float64
dtypes: float64(12), int64(2)
memory usage: 55.5 KB
None
cs

RangeIndex: 506 entries를 통해서 총 샘플의 수가 506개라는 것을 알 수 있다. 또 Data columns가 14개인 것을 보아 컬럼 수가 14개라는 것을 알 수 있다. 

 

일부를 출력해서 데이터를 확인해보도록 하자.

 

@ 코드

1
print(df.head())
cs

 

@ 실행 결과

1
2
3
4
5
6
7
8
        0     1     2   3      4      5   ...  8      9     10      11    12    13
0  0.00632  18.0  2.31   0  0.538  6.575  ...   1  296.0  15.3  396.90  4.98  24.0
1  0.02731   0.0  7.07   0  0.469  6.421  ...   2  242.0  17.8  396.90  9.14  21.6
2  0.02729   0.0  7.07   0  0.469  7.185  ...   2  242.0  17.8  392.83  4.03  34.7
3  0.03237   0.0  2.18   0  0.458  6.998  ...   3  222.0  18.7  394.63  2.94  33.4
4  0.06905   0.0  2.18   0  0.458  7.147  ...   3  222.0  18.7  396.90  5.33  36.2
 
[5 rows x 14 columns]
cs

 

 

2. 선형 회귀 실행


선형 회귀 데이터는 마지막에 참과 거짓을 구분할 필요가 없다. 따라서 출력층에 활성화 함수를 지정할 필요도 없다.

1
2
3
4
model = Sequential()
model.add(Dense(30, input_dim = 13, activation = 'relu'))
model.add(Dense(6, activation = 'relu'))
model.add(Dense(1))
cs

 

모델의 학습이 어느정도 진행되었는지 확인하기 위해서 예측 값과 실제 값을 비교하는 부분을 추가하였다.

1
2
3
4
5
Y_prediction = model.predict(X_test).flatten()
for i in range(10):
    label = Y_test[i]
    prediction = Y_prediction[i]
    print("실제 가격: {:.3f}, 예상가격: {:.3f}".format(labell, prediction))
cs

flatten은 2차원 리스트를 1차원 리스트로 바꿔주는 역할을 한다.

 

전체 코드는 다음과 같다.

 

@ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
 
import pandas as pd
import numpy
import tensorflow as tf
 
df = pd.read_csv("/Users/Downloads/006958-master/deeplearning/dataset/housing.csv", delim_whitespace = True, header = None)
 
# 시드값 설정
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(seed)
 
dataset = df.values
= dataset[:, 0:13]
= dataset[:, 13]
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.3, random_state = seed)
 
model = Sequential()
model.add(Dense(30, input_dim = 13, activation = 'relu'))
model.add(Dense(6, activation = 'relu'))
model.add(Dense(1))
 
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
 
model.fit(X_train, Y_train, epochs = 200, batch_size = 10)
 
# 예측 값과 실제 값의 비교
Y_prediction = model.predict(X_test).flatten()
for i in range(10):
    label = Y_test[i]
    prediction = Y_prediction[i]
    print("실제 가격: {:.3f}, 예상가격: {:.3f}".format(label, prediction))
cs

 

@ 실행결과

1
2
3
4
5
6
7
8
9
10
실제 가격: 22.600, 예상가격: 20.511
실제 가격: 50.000, 예상가격: 26.380
실제 가격: 23.000, 예상가격: 21.946
실제 가격: 8.300, 예상가격: 12.437
실제 가격: 21.200, 예상가격: 18.368
실제 가격: 19.900, 예상가격: 21.967
실제 가격: 20.600, 예상가격: 19.311
실제 가격: 18.700, 예상가격: 24.118
실제 가격: 16.100, 예상가격: 18.969
실제 가격: 18.600, 예상가격: 13.225
cs

 

 

* 출처

조태호, 모두의 딥러닝(2017), 길벗

https://cnpnote.tistory.com/entry/PYTHON-공백으로-구분-된-값으로-파일을-읽는-방법

 

[PYTHON] 공백으로 구분 된 값으로 파일을 읽는 방법

공백으로 구분 된 값으로 파일을 읽는 방법 그 파일을 판다로 읽으려고합니다. 파일에는 공백으로 구분 된 값이 있지만 공백 수는 다릅니다. 나는 시도했다 : pd.read_csv('file.csv', delimiter=' ') 하지��

cnpnote.tistory.com

https://programmers.co.kr/learn/courses/4008/lessons/12738

 

파이썬을 파이썬답게 - 2차원 리스트를 1차원 리스트로 만들기 - from_iterable

본 강의는 파이썬 문법을 이미 알고 있는 분들을 대상으로 만들어졌습니다. ##### 이런 분들께 추천합니다 * 파이썬 문법을 알고 계시는 분 * 알고리즘 문제를 조금 더 쉽게 풀고 싶은 분 * Python 코

programmers.co.kr

 

Comments