pandas 데이터프레임 특정 조건을 만족하는 열 & 행 추출 / train_test_split() / Keras - Sequential 기본 정리 / pyplot 2개 그래프 한 번에 시각화

ssook·2023년 10월 7일
0

TIL

목록 보기
9/17
post-thumbnail

📍 Tensorflow 최종

딥러닝 시 필요한 라이브러리


# 필요한 라이브러리 불러오기

import numpy as np
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

Keras Sequantial Model

모델 구성하는 방법

# Keras의 Sequential 모델 구성하기

initializer = tf.keras.initializers.GlorotUniform(seed=42) #모델 시드 고정하기
model = Sequential()
model.add(Dense(units=1, input_shape=(1,),kernel_initializer=initializer))
model.summary()
  • seed 매개변수를 사용하여 시드를 고정하는 것은 난수 생성을 제어하기 위함.

모델 학습 최적화 방법


# 모델을 학습시킬 최적화 방법, loss 계산 방법, 평가 방법 설정하기
model.compile(optimizer='sgd', loss='mse', metrics=['mae'])

모델 학습시키는 방법


model.fit(x_train, y_train, epochs=1000)

모델 가중치 확인하기

print(model.weights)

딥러닝은 모델의 가중치를 찾으려고 하는 것이기 떄문에, 이 가중치가 생각보다 중요하다.

학습 완료된 모델 사용하여 예측하기


# 학습 완료된 모델 사용하여 예측하기
print(model.predict([[11],[12],[13]]))

실제 예제 보기

1. 모델 생성하기


# 필요한 라이브러리 불러오기

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Input, Dense, Dropout
from tensorflow.keras.layers import BatchNormalization
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
import random

# 모델 시드 고정하기
tf.random.set_seed(42)
np.random.seed(42)
random.seed(42)

# Keras의 Sequential 객체로 딥러닝 모델 구성하기
initializer = tf.keras.initializers.GlorotUniform(seed=42) #모델 시드 고정하기
model = Sequential()

model.add(Dense(32, activation='relu', input_shape =(25,),kernel_initializer=initializer))
model.add(Dense(64, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))

2. 모델 컴파일하기


# 모델을 학습시킬 최적화 방법, loss 계산 방법, 평가 방법 설정하기
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

3. 모델 학습하기


# 모델 학습하기
es = EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1, restore_best_weights=True)
history = model.fit(X_train, y_train, epochs=100, batch_size=128,
          verbose=1, validation_data=(X_val, y_val), callbacks=[es])

여기서는 earlystop을 써서, 변화가 없으면 학습 중에 멈추게끔 했다.

모델 결과 역시 histroy 변수에 저장함.

4. 모델 과정 시각화하기

import matplotlib.pyplot as plt

# 훈련 과정 정확도(accuracy) 시각화하기
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()

# 훈련 과정 손실(loss) 시각화하기
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend(['Train', 'Validation'], loc='upper right')
plt.show()

여기서는 pyplot 써서 Model 학습 과정을 시각화함.

📍 시각화 싸그리 몽창 정리

1. 일변량 시각화 탐색(Maplotlib)하기

선그래프 - plt.plot()


# 시각화 라이브러리 불러오기
import matplotlib.pyplot as plt

# 시각화 영역(figure) 지정하기
plt.figure()

# days_left의 price 데이터로 선 그래프 그리기
plt.plot(days_left['price'])

# X축 이름 지정하기
plt.xlabel("Days_left")

# Y축 이름 지정하기
plt.ylabel("Price")

# 시각화 표기하기
plt.show()

막대 그래프 - plt.bar()


# 인덱스를 리스트로 만들기
label = airline.index
plt.figure()

# 인덱스를 X, 평균가격을 Y로 하는 막대 그래프 그리기
plt.bar(label, airline['price'])
plt.xlabel("Airline")
plt.ylabel("Price")
plt.show()

파이 그래프 - plt.pie()

# departure_time 빈도표 데이터 만들기
departure_time=df['departure_time'].value_counts()
plt.figure(figsize=(10,6))

# departure_time 빈도표 데이터로 파이 그래프 그리기
plt.pie(departure_time, labels=departure_time.index, autopct='%.1f%%')
plt.show()

도수 분포표 - plt.hist()

plt.figure()
# duration을 20개 구간으로 나눠서 히스토그램 그리기
plt.hist(df['duration'], bins=10)

# duration을 10개 구간으로 나눠서 히스토그램 그리기
plt.hist(df['duration'], bins=20)
plt.xlabel("Duration")
plt.ylabel("Flights")

# 동시에 2개의 그래프를 하나의 시각화 영역에 그려 범례 지정하기
plt.legend(("Bin 10", "Bin 20"))
plt.show()

상자 그래프 - plt.boxplot()

plt.figure()

# Price 칼럼에 대한 상자 그래프 그리기
plt.boxplot(list(df['price']))
plt.ylabel("price")
plt.show()

2. 이변량 시각화

산점도 - plt.scatter()

plt.figure(figsize=(16,8))

# price와 dration간의 산점도 그리기
plt.scatter(y=df["price"], x=df["duration"])
plt.xlabel("Duration")
plt.ylabel("Price")
plt.show()

히트맵 - plt.pcolor()

# numpy 불러오기
import numpy as np

# 상관계수 데이터 만들기
heat=df_eco.corr()

# 상관계수로 heatmap그리기
plt.pcolor(heat)

# x축 항목 정보 표기하기
plt.xticks(np.arange(0.5, len(heat.columns), 1), heat.columns)

# y축 항목 정보 표기하기
plt.yticks(np.arange(0.5, len(heat.index), 1), heat.index)

# 히트맵 확인을 위한 컬러바 표기하기
plt.colorbar()
plt.show()

3. Seaborn 함께 활용하기

범주형 산점도 - sns.catplot()

sns.catplot(y="airline", x="price", col='class', data=df)

선형회귀 모델 그래프 - sns.lmplot()

# duration과 price의 회귀선을 빨간색으로 표시해서 시각화 하기
sns.lmplot(x='duration', y='price', data=df_eco, line_kws={'color': 'red'})

빈도 그래프 - sns.countplot()

# 항공권 데이터의 빈도를 airline으로 구분하여 class별로 시각화 하기
sns.countplot(x="airline", hue="class", data=df)

조인트 그래프 - sns.jointplot()

# price와 duration간의 관계를 joint plot으로 시각화 하기
sns.jointplot(y="price", x="duration", data=df_eco)

히트맵 - sns.heatmap()

# 상관계수로 heatmap그리기
sns.heatmap(df_eco.corr())

📍 데이터 프레임 특정 조건에 맞는 행과 열 추출 하는 방법 관련 정리

판다스(Pandas)를 사용하여 데이터프레임(DataFrame)에서 특정 조건에 맞는 열 또는 행을 추출하는 방법

열(컬럼) 추출:

  1. 단일 열 추출: 특정 열(컬럼)을 추출하려면 데이터프레임 이름 뒤에 원하는 열의 이름을 대괄호로 넣어서 접근.
import pandas as pd

# 데이터프레임 생성
data = {'이름': ['Alice', 'Bob', 'Charlie'],
        '나이': [25, 30, 35],
        '성별': ['여성', '남성', '남성']}

df = pd.DataFrame(data)

# '나이' 열만 추출
ages = df['나이']
print(ages)
  1. 여러 열 추출: 여러 열을 추출하려면 데이터프레임에서 여러 열의 이름을 리스트로 묶어서 대괄호 안에 넣습니다.
# '이름'과 '성별' 열 추출
selected_columns = df[['이름', '성별']]
print(selected_columns)
  1. 열 내의 각 원소에 대해 조건을 적용하고 특정 조건을 만족하는 원소만 포함된 열을 추출

열 내의 각 원소에 대해 조건을 적용하고 특정 조건을 만족하는 원소만 포함된 열을 추출하려면,

판다스의 apply 메서드를 사용하여 열을 조작하고 새로운 열을 생성할 수 있음.

아래는 예시 코드임.

import pandas as pd

# 데이터프레임 생성
data = {'A': [10, 20, 30, 40],
        'B': [5, 15, 25, 35]}

df = pd.DataFrame(data)

# 'A' 열의 값이 20보다 큰 경우, 'B' 열의 값을 추출하는 새로운 열 생성
df['C'] = df.apply(lambda row: row['B'] if row['A'] > 20 else None, axis=1)

# 'C' 열을 출력
print(df['C'])
  1. 특정 조건을 만족하는 열만 추출하는 방법

condition 변수를 설정하여, 각 열에 대해 20보다 큰 값을 가진 원소가 1개 이상인 열을 선택함.

그리고 df.loc를 사용하여 해당 열만을 추출하여 filtered_df에 저장함.

import pandas as pd

# 데이터프레임 생성

data = {'A': [10, 20, 30, 40],
'B': [5, 15, 25, 35],
'C': [50, 60, 70, 80]}

df = pd.DataFrame(data)

# 조건을 만족하는 열만 추출할 조건 설정

condition = (df > 20).sum() > 1  # 열 내에서 20보다 큰 값이 1개 이상인 열 선택

# 조건을 만족하는 열만을 데이터프레임으로 추출

filtered_df = df.loc[:, condition]

print(filtered_df)

행(로우) 추출:

  1. 조건에 따른 행 추출: 조건에 맞는 행을 추출하려면 조건을 설정하고 이를 활용하여 데이터프레임을 필터링해야 함.
# '나이'가 30 이상인 행 추출
filtered_rows = df[df['나이'] >= 30]
print(filtered_rows)
  1. 행 슬라이싱: 행 번호를 사용하여 슬라이싱을 통해 특정 범위의 행을 추출 가능
# 첫 번째부터 두 번째 행까지 추출 (0번 인덱스부터 1번 인덱스까지)
sliced_rows = df.iloc[0:2]
print(sliced_rows)

📍 train_test_split

데이터를 학습용(train)과 테스트용(test)으로 나누는데 사용되는 함수로, 주로 파이썬의 scikit-learn 라이브러리에서 제공됨.

이 함수는 데이터를 무작위로 섞어서 나누며, 머신 러닝 모델을 훈련하고 평가하기 위해 데이터를 분할할 때 유용함.

데이터를 나눌 때 사용되는 주요 파라미터들이 아래와 같음.


파라미터들

  1. X (배열 또는 데이터프레임): 피처(Feature) 데이터로서, 학습용과 테스트용으로 나눌 때 쓰이는 데이터.

  2. y (배열 또는 시리즈): 타겟(Target) 데이터로서, 예측하고자 하는 값.

  3. test_size (float 또는 int): 테스트 세트의 비율 또는 개수를 지정.

    예를 들어, test_size=0.2는 데이터의 20%를 테스트 세트로 사용하고 나머지 80%를 학습 세트로 사용함.

  4. train_size (float 또는 int, 선택 사항): 학습 세트의 비율 또는 개수를 지정 가능함. test_size를 지정하면 자동으로 계산됨.

  5. random_state (int 또는 RandomState 인스턴스, 선택 사항): 난수 발생을 제어하기 위한 시드(seed)값을 설정함.

    동일한 시드값을 사용하면 항상 같은 분할이 생성됨.

아래는 예시 코드임.

from sklearn.model_selection import train_test_split
import numpy as np

# 가상의 데이터 생성
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 1, 0, 1])

# 데이터를 학습용(train)과 테스트용(test)으로 나눔
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 결과 출력
print("학습용 데이터(X_train):\n", X_train)
print("테스트용 데이터(X_test):\n", X_test)
print("학습용 타겟(y_train):\n", y_train)
print("테스트용 타겟(y_test):\n", y_test)

이 코드에서는 Xy 데이터를 70%의 학습용 데이터와 30%의 테스트용 데이터로 나누고 있음.

random_state를 지정하여 난수 시드를 고정하였으므로, 코드를 여러 번 실행해도 항상 동일한 분할이 생성됨.


📍 Keras Sequential

사용하는 패키지

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

입력, 출력 데이터 형태

  • 입력 데이터 [[ 1] [ 2] [ 3] [ 4] [ 5] [ 6] [ 7] [ 8] [ 9] [10]]
  • 입력 데이터 형태 (10, 1) X = df.drop(['satisfaction'], axis=1) → 이런 식으로 열 1개만 입력 값으로 넣을 수 있게끔 세팅을 해줘야 함.
  • 출력 데이터 [ 3 5 7 9 11 13 15 17 19 21]
  • 출력 데이터 형태
  • 출력 데이터 형태 (10,)

입력은 열 1개에 데이터가 온다면, 출력 데이터는 행 1개에 열 여러 개가 데이터가 들어오는 느낌


Keras의 Sequential 모델 구성하기

Sequential 모델은 층(layer)을 순차적으로 쌓아가는 방식으로 신경망을 정의함.

각 층은 model.add 메소드를 사용하여 추가되며, 다양한 옵션과 하이퍼파라미터를 설정할 수 있음.

  1. 층 추가 (model.add): model.add 메소드를 사용하여 순차 모델에 층을 추가함. 예를 들어,

    Dense 층은 fully connected 층을 의미하며, Conv2D 층은 2D 컨볼루션 층을 의미합니다.

  2. 활성화 함수: 각 층에 활성화 함수를 적용할 수 있음. 예를 들어, activation='relu'과 같이 활성화 함수를 설정 가능함.

  3. Dropout: Overfitting을 방지하기 위해 Dropout을 추가할 수 있음. Dropout 층을 추가하여 일부 뉴런을 무작위로 비활성화함.

    이를 통해 모델의 일반화 성능을 향상시킬 수 있음.

  4. 손실 함수: model.compile 메소드를 사용하여 모델의 손실 함수를 지정함.

    예를 들어, 회귀 문제의 경우 loss='mse' (평균 제곱 오차)를 사용하고, 분류 문제의 경우 loss='categorical_crossentropy'와 같은 손실 함수를 선택할 수 있음.

  5. 에포크 및 손실 저장: 모델을 훈련할 때, 에포크(epoch) 수를 지정하고 훈련 중에 발생하는 손실을 저장하는 방법이 중요함.

    이를 위해 model.fit에서 epochs 파라미터를 설정하고, 훈련 결과를 저장하기 위한 변수를 사용함.

  6. 평가 및 비교: model.fit을 사용하여 훈련을 진행하면 각 에포크마다 손실이 출력됨.

    또한 model.evaluate를 사용하여 테스트 데이터에 대한 손실을 평가할 수 있음.

from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import Adam

# Sequential 모델 생성
model = Sequential()

# 입력층과 첫 번째 은닉층 추가
model.add(Dense(units=64, activation='relu', input_dim=10))
model.add(Dropout(0.2))  # Dropout 추가

# 두 번째 은닉층 추가
model.add(Dense(units=32, activation='relu'))

# 출력층 추가
model.add(Dense(units=1, activation='linear'))

# 모델 컴파일 (손실 함수 및 옵티마이저 설정)
model.compile(loss='mse', optimizer=Adam(lr=0.001))

# 다른 예제
# 모델을 학습시킬 최적화 방법, loss 계산 방법, 평가 방법 설정하기
model.compile(optimizer='sgd', loss='mse', metrics=['mae'])

# 에포크 수와 손실 저장 변수 설정
epochs = 100
losses = []

# 모델 훈련
for epoch in range(epochs):
    history = model.fit(X_train, y_train, epochs=1, verbose=0)  # 한 에포크씩 훈련
    loss = history.history['loss'][0]  # 손실 값 추출
    losses.append(loss)  # 손실 저장

    # 매 에포크마다 손실 출력
    print(f'에포크 {epoch + 1}/{epochs}, 손실: {loss}')

# 모델 평가
test_loss = model.evaluate(X_test, y_test)
print(f'테스트 손실: {test_loss}')

위 코드에서는 회귀 문제를 다루고 있으며, 평균 제곱 오차 (mse)를 손실 함수로 사용함.

에포크마다 손실이 저장되고, 마지막에 테스트 데이터에서 손실을 평가함.

MSE와 같은 지표는 주로 회귀 문제에서 사용하며, 훈련 데이터와 테스트 데이터 간의 차이는 과적합(Overfitting) 여부를 판단하기 위해 사용됨.

훈련 데이터의 손실이 감소하지만 테스트 데이터의 손실이 증가하면 모델이 과적합되고 있을 가능성이 있음.


initializer = tf.keras.initializers.GlorotUniform(seed=42) #모델 시드 고정하기
model = Sequential()
model.add(Dense(units=1, input_shape=(1,),kernel_initializer=initializer))
model.summary()

그 외에 사용하는 함수

# 모델 가중치 확인하기
print(model.weights)

# 모델 레이어의 가중치 출력하기
print(f'weight : {model.layers[0].weights[0].numpy()}')
print(f'bias : {model.layers[0].bias.numpy()}')

es = EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1, restore_best_weights=True)
history = model.fit(X_train, y_train, epochs=100, batch_size=128,
          verbose=1, validation_data=(X_val, y_val), callbacks=[es])

import matplotlib.pyplot as plt

# 훈련 과정 정확도(accuracy) 시각화하기
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()

# 훈련 과정 손실(loss) 시각화하기
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend(['Train', 'Validation'], loc='upper right')
plt.show()

📍 pyplot(a.k.a plt) 관련 헷갈리는 부분 정리

한 플롯에 두 개의 직선 그래프 만들고 범례 추가해서 시각화하기

  1. pyplot 라이브러리 가져오기
import matplotlib.pyplot as plt
  1. 두 개의 직선 그래프 생성하기. 이 때 plot 함수를 사용하는 데, 각 직선에 대한 데이터와 스타일을 설정함.
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]

plt.plot(x, y1, label='선 그래프 1', linestyle='-', marker='o', color='b')  # 첫 번째 선 그래프
plt.plot(x, y2, label='선 그래프 2', linestyle='--', marker='x', color='r')  # 두 번째 선 그래프
  1. 각 직선에 대한 범례를 추가함. label 파라미터를 plot 함수에 설정하여 범례를 지정함.

    matplotlib.pyplot에서 범례에 들어갈 텍스트는 각 선 그래프를 생성할 때 사용한 label 파라미터를 통해 지정함.

    label 파라미터에 원하는 텍스트를 설정하면, 해당 텍스트가 범례에 표시됨.

  2. 범례를 화면에 표시하기 위해 legend 함수를 호출함. 범례의 위치와 스타일을 설정 가능함.

plt.legend(loc='upper right')  # 범례 위치 설정
  1. 그래프를 표시함.
plt.show()

아래는 전체 예시 코드임

pythonCopy code
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]

plt.plot(x, y1, label='선 그래프 1', linestyle='-', marker='o', color='b')
plt.plot(x, y2, label='선 그래프 2', linestyle='--', marker='x', color='r')

plt.legend(loc='upper right')

plt.show()

이렇게 하면 두 개의 선 그래프가 생성되고, 각각의 범례가 맞춰져 시각화됨.


profile
개발자에서, IT Business 담당자로. BrSE 업무를 수행하고 있습니다.

0개의 댓글