본문 바로가기

7. ML | DL | NLP

6/8(목) IT K-DT(66일차) / 1.머신러닝~5.선형회귀

 

 

1. 머신러닝 

인공지능: 인공(Artificial) + 지능(Intelligence)
머신러닝: 데이터를 기반으로 한 학습(learning)하는 기계(machine)
딥러닝: 깊은(deep) 신경망 구조의 머신러닝(machine learning)


머신러닝의 배경
과거 컴퓨터로 데이터를 읽어들이고, 데이터 안에서 특징을 학습하여 패턴을 찾아내는 작업 → 패턴인식
데이터를 대량으로 수집/처리할 수 있는 환경이 갖춰짐으로 할 수 있는 일들이 많아짐.
머신러닝은 데이터로부터 특징이나 패턴을 찾아내는 것이기 때문에 데이터가 가장 중요.

 

머신러닝의 정의
인공지능의 한 분야로 컴퓨터가 학습할 수 있도록 하는 알고리즘/기술을 개발하는 분야
'무엇(x)으로 무엇(y)을 예측하고 싶다'의 f(함수)를 찾아내는 것
y: 출력변수(종속변수), x: 입력변수(독립변수), f: 모형(머신러닝 알고리즘)

 

관련 웹사이트:

1) 캐글(Kaggle)

전세계 데이터 사이언티스트들이 다양한 데이터를 분석하고 토론할 수 있는 커뮤니티. 가장 유명함.

https://www.kaggle.com/ 

 

Kaggle: Your Machine Learning and Data Science Community

Kaggle is the world’s largest data science community with powerful tools and resources to help you achieve your data science goals.

www.kaggle.com

데이터 분석 및 머신러닝, 딥러닝 대회를 개최하며 데이터셋, 파이썬자료, R자료 등을 제공.

 

2) 데이콘(DACON)

국내 데이터 커뮤니티로, 한국의 캐글(Kaggle). 다양한 데이터관련 경진대회를 개최.

https://dacon.io/ 

 

데이터사이언티스트 AI 컴피티션

8만 AI 팀이 협업하는 데이터 사이언스 플랫폼. AI 경진대회와 대상 맞춤 온/오프라인 교육, 문제 기반 학습 서비스를 제공합니다.

dacon.io

 

 

1-1. 머신러닝으로 할 수 있는 것

1-1-1. 회귀(Regression)

* 시계열(시간적인 변화를 연속적으로 관측) 데이터 같은 '연속된 데이터'를 취급할 때 사용하는 기법.
* 예) 과거 주식 추세를 학습해서 내일의 주가를 예측하는 시스템을 개발.

 

1-1-2. 분류(Classification)

* 주어진 데이터를 클래스별로 구별해 내는 과정. 데이터와 데이터의 레이블값을 학습시키고

  어느 범주에 속한 데이터인지 판단하고 예측. (이산적인 클래스를 예측하는 데 사용)
* 예) 스팸메일인지 아닌지를 구별해주는 시스템을 개발.

 

 

1-1-3. 클러스터링(Clustering)

분류와 비슷하지만 데이터에 레이블(종속변수. 정답데이터)이 없음.
비슷한 특징의 데이터를 그룹화하는 학습.
예) SNS 데이터를 통해 소셜 및 사회 이슈를 파악.

 

 

1-2. 학습

1-2-1. 지도 학습

문제와 정답을 모두 학습시켜 예측 또는 분류하는 문제
y=f(x)에 대하여 입력변수(x)와 출력변수(y)의 관계에 대하여 모델링 하는 것.

회귀, 분류문제를 해결하는데 사용됨.

예) 사진에 포함된 고양이와 개를 구분하는 모델을 만들기 위해 고양이와 개 사진의 데이터와

      해당 레이블(고양이 또는 개)을 사용할 수 있음.

 

1-2-2. 비지도 학습

지도 학습의 반대. 출력변수(y)가 존재하지 않고, 입력변수(x)간의 관계에 대해 모델링 하는 것.

클러스터링, 차원 축소, 이상 탐지 등에 활용됨.

예) 구매패턴이 유사한 고객들의 분류, 유사한 이미지의 그룹화(군집분석).
      군집분석: 유사한 데이터끼리의 그룹화.
      주성분 분석(PCA): 차원축소. 다차원 데이터의 주요한 변동성을 설명하는 주성분을 추출.

 

1-2-3. 강화 학습

수 많은 시뮬레이션을 통해 현재의 선택이 미래에 보상이 최대가 되도록 학습하는 것.

로봇 제어, 게임 플레이, 자율 주행 자동차 등의 문제에 사용됨.

예를 들어, 강화학습을 사용하여 로봇이 어떤 작업을 수행하도록 학습시킬 수 있음.

 

2. 사이킷런(Scikit-learn)

2-1. 사이킷런(Scikit-learn)

대표적인 파이썬 머신러닝 모듈로, 다양한 머신러닝 알고리즘을 제공함.
다양한 샘플 데이터를 제공하며, 머신러닝 결과를 검증하는 기능 또한 제공함.

파이썬의 수치 및 과학 라이브러리 NumPy 및 SciPy와 함께 운용되도록 설계됨.
BSD 라이선스이므로 무료로 사용 및 배포가 가능함.
공식 홈페이지: https://scikit-learn.org/stable/

 

scikit-learn: machine learning in Python — scikit-learn 1.2.2 documentation

Model selection Comparing, validating and choosing parameters and models. Applications: Improved accuracy via parameter tuning Algorithms: grid search, cross validation, metrics, and more...

scikit-learn.org

 

교육 간 Google Colab을 이용할 예정

 

 

사이킷런은 다양한 데이터셋을 제공하여 머신러닝 모델의 학습과 평가를 실습하는 데 유용함.

(데이터셋: 특정한 작업을 위해 데이터를 관련성있게 모아놓은 것.)

사이킷런 데이터셋 페이지

https://scikit-learn.org/stable/modules/classes.html?highlight=datasets#module-sklearn.datasets 

 

API Reference

This is the class and function reference of scikit-learn. Please refer to the full user guide for further details, as the class and function raw specifications may not be enough to give full guidel...

scikit-learn.org

 

2-2. LinearSVC(Linear Support Vector Classifier)

선형SVM(Support Vector Machine)의 분류기의 한 종류.

(선형 SVM: 입력 데이터를 선형 경계로 분류하는 데 사용되는 강력한 머신러닝 알고리즘.)
따라서, LinearSVC는 각 클래스를 구분하는 선을 그려주는 알고리즘.


LinearSVC는 입력 데이터의 이진 분류/다중 분류에 적용됨.

 

LinearSVC는 선형 분류 문제에서 빠르고 효율적인 알고리즘으로 알려져있음.

특히, 입력 데이터가 선형적으로 구분될 수 있는 경우에 유용함.

그러나 비선형적인 문제에 대해서는 선형 분류 경계를 찾는 것이 한계가 있음.

이런 경우 커널 기법을 사용한 SVM 알고리즘(SVM with RBF Kernel)을

고려해볼 수 있음.

LinearSVC는 다양한 응용 분야에서 사용될 수 있으며, 

특히 텍스트 분류, 이미지 분류, 생체 인식 등의 문제에 널리 사용됨.

데이터셋의 크기가 크거나 특성의 개수가 많은 경우에도 효과적으로 작동할 수 있음.

LinearSVC는 훈련된 후에는 새로운 입력 데이터에 대한 예측을 수행하는 데 사용할 수 있음.

즉, 주어진 특성에 따라 새로운 데이터 포인트를 클래스 레이블로 분류할 수 있음.

(클래스를 구분으로 하는 분류 문제에서 각 클래스를 잘 구분하는 선을 그려주는 방식을 사용하는 알고리즘)

 

지도학습 알고리즘을 사용하는 '학습 전용 데이터'와 '결과 전용 데이터'를 함께 갖고 있어야 사용이 가능함.

 

# LinearSVC: 선형 SVM 분류기를 구현한 클래스
# accuracy_score: 분류 모델의 예측 결과와 실제 레이블을 비교하여 정확도를 계산하는 함수
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score

# 학습 데이터 준비
learn_data = [[0,0], [1,0], [0,1], [1,1]] # 독립변수
learn_label = [0,0,0,1] #종속변수

# 모델 객체 생성
svc = LinearSVC()

# 학습
svc.fit(learn_data, learn_label)

 

 

test_data = [[0,0], [1,0], [0,1], [1,1]] # 검증데이터 (= '시험볼 문제를 준비하겠다'는 의미)
test_label = svc.predict(test_data) # 예측(='시험을 본다'는 의미)
test_label # 출력

 

 

# 예측 결과가 정답인지 확인
print(test_data, '의 예측결과:', test_label)

 

 

# 정답률 확인
print('정답률: ', accuracy_score([0,0,0,1], test_label)) # 정답률: 1.0 = 100%의 의미

 

 

 

3. 아이리스 데이터셋


Iris DataSet: 
붓꽃(Iris) 데이터셋은 사이킷런 라이브러리에 내장되어 있는 예제 데이터셋 중 하나.

이 데이터셋은 붓꽃의 꽃받침 길이(sepal length), 꽃받침 너비(sepal width), 꽃잎 길이(petal length), 꽃잎 너비(petal width)를
측정한 총 150개의 붓꽃 샘플로 구성되어 있음.

각 샘플은 세 가지 다른 종류의 붓꽃(Setosa, Versicolour, Virginica) 중 하나에 속하며,
이러한 부분에 따라 세 개의 클래스로 구분됨.
이러한 붓꽃 클래스는 머신러닝 모델을 사용하여 붓꽃의 종류를 예측하는 분류 작업에 사용될 수 있음.

 

 

 

from sklearn.datasets import load_iris

iris = load_iris() # iris와 관련된 데이터를 모두 불러옴.

print(iris['DESCR']) # iris와 관련된 전체적인 설명을 확인.
#    :Attribute Information:
#        - sepal length in cm : 꽃받침의 길이
#        - sepal width in cm : 꽃받침의 너비
#        - petal length in cm : 꽃잎의 길이
#        - petal width in cm : 꽃잎의 너비
#        - class:
#                - Iris-Setosa
#                - Iris-Versicolour
#                - Iris-Virginica
 
data = iris['data'] # iris의 데이터를 모두 가져옴.

target = iris['target']
target # '정답'과 유사한 개념

 

 

# ndarray인 data를 dataFrame으로 변경
# 먼저 column을 지정
feature_names = iris['feature_names']
feature_names

 

 

import pandas as pd
# ndarray인 data를 dataFrame으로 변경
df_iris = pd.DataFrame(data, columns = feature_names)
df_iris.head()

 

 

# 오른쪽에 target 필드값을 추가하려는 경우
df_iris['target'] = target
df_iris

 

 

# train_test_split: 데이터를 무작위로 섞은 후,

지정된 비율에 따라 학습 데이터와 테스트 데이터로 나누어 주는 함수.

from sklearn.model_selection import train_test_split
train_test_split

( 독립변수 , 종속변수 , test_size[기본값=0.25%. 75:25로 나뉘어진다는 의미], random_state[임의의 값])
#  random_state 값을 동일하게 유지한다면 코드를 여러 번 실행할 때 항상 같은 데이터 분할 결과가 생성됨.

#  'target' 열을 제외한 나머지 열을 독립변수로, 'target' 열을 종속변수로 선택.
X_train, X_test, Y_train, Y_test = train_test_split(df_iris.drop('target',1), df_iris['target'], test_size=0.2, random_state=10)
# X_train, X_test, Y_train, Y_test 변수에 각각 학습 데이터와 테스트 데이터가 저장됨.

X_train.shape, X_test.shape # 120,4와 30,4로 8대2.

 

 

X_train # 120*4의 모양을 하고 있음.

 

 

Y_train.shape, Y_test.shape # 120, 30으로 8대2.

 

 

 

 


Classes: 3 # 붓꽃 데이터셋은 3개의 클래스로 구분됨. 즉, 세 가지 다른 종류의 붓꽃을 나타냄.

Samples per class: 50 # 클래스당 50개의 샘플이 있음. =각 붓꽃 클래스마다 50개의 데이터 포인트가 존재.
# 데이터셋에는 총 150개의 샘플이 있음. 각 샘플은 하나의 붓꽃을 나타냄.
Samples total: 150 # 데이터셋은 4차원.

각 샘플은 4개의 독립변수(꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비)로 구성.

Dimensionality: 4
# 독립변수(특성)는 실수형이며, 양수 값으로 표현됨.
# 이는 꽃의 크기 및 길이와 같은 양적인 특성을 나타내는 것을 의미함.
Features: real, positive

 

 

# 머신러닝 모델에 넣어 학습을 하려는 경우

from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

svc = SVC()
svc.fit(X_train, y_train)

# 시험을 봄
y_pred = svc.predict(X_test)

print('정답률: ', accuracy_score(y_test, y_pred))

 

 

4. 타이타닉 데이터셋


타이타닉 데이터셋:
사이킷런(Scikit-learn) 라이브러리에 내장되어 있지는 않지만, 매우 유명하고 널리 사용되는 데이터셋.
이 데이터셋은 1912년에 발생한 타이타닉호의 여객들에 대한 정보를 담고 있음.
머신러닝과 데이터 분석의 예제로 자주 활용되며, 생존 여부와 관련된 예측 모델을 구축하는 데 사용됨.


 

import numpy as np
import pandas as pd


# 타이타닉 데이터셋을 불러옴
df = pd.read_csv('https://bit.ly/fc-ml-titanic')

df.head()

 

 


* passengerid: 승객번호
* survived: 생존여부(0:사망, 1:생존)
* pclass: 좌석등급
* name: 이름
* sex: 성별
* age: 나이
* sibsp: 형제,자매,배우자 수
* parch: 부모,자식 수
* ticket: 티켓번호
* fare: 요금
* cabin: 좌석번호
* embarked: 탑승항구

 

4-1. 데이터 전처리

넓은 범위의 데이터 정제작업을 뜻함.

일반적으로는 필요없는 데이터를 삭제하고, 필요한 데이터만 취하는 것을 의미.

null 값이 있는 행을 삭제하는 것, 정규화, 표준화 등의 많은 작업들을 포함하고 있음.

데이터의 품질을 향상시키고, 노이즈를 제거하며, 모델의 성능을 향상시키는 데 도움이 됨.
머신러닝, 딥러닝 실무에서도 전처리가 50% 이상을 차지함.

4-1-1. 결측치 처리

 

df.info()
# 확인결과, Age와 Cabin, Embarked에 결측치(null값)가 있음.

 

 

# 결측치의 갯수를 확인
df.isnull().sum()

 

 

# age는 0을 줄 수 없으므로 결측치를 평균으로 처리할 예정.
df['Age'] = df['Age'].fillna(df['Age'].mean())

df['Age']
# 평균값은 소수점이 존재하는 부분 → 결측치의 처리가 완료된 값.

 

 


결측치 관련 메서드:

.isnull():
데이터프레임(DataFrame)/시리즈(Series) 객체에서 결측치를 확인하는 메서드.

.fillna():
데이터프레임(DataFrame)/시리즈(Series) 객체에서 결측치를 다른 값으로 대체하는 메서드.

.isna():
데이터프레임(DataFrame)/시리즈(Series) 객체에서 각 요소가 결측값인지 여부를 확인하는 메서드.

 

4-1-2. 라벨 인코딩(Label Encoding)

범주형 변수를 숫자 형태로 변환하는 과정.

머신 러닝 알고리즘은 일반적으로 숫자형 데이터를 입력으로 사용하므로,

범주형 변수를 숫자로 인코딩하는 작업이 필요함.

이때 라벨 인코딩은 가장 간단하고 일반적인 인코딩 방법 중 하나임.

df.info()

 

 

# 성별의 종류: male, female만 있음
df['Sex'].value_counts()

 

 

# male은 1, female은 0으로 변환
def convert_sex(data):
  if data == 'male':
    return 1
  elif data == 'female':
    return 0

df['Sex'] = df['Sex'].apply(convert_sex)
df.head()

 

 

# 라벨 인코딩 기능을 구현한 클래스로, 간편하게 범주형 변수를 숫자로 변환할 수 있음.
from sklearn.preprocessing import LabelEncoder

# LabelEncoder()를 le로 줌
le = LabelEncoder()

# 항구의 종류: S, C, Q만 있음
df['Embarked'].value_counts()

 

 

# embarked를 숫자로 인코딩 한 내용.
le.fit_transform(df['Embarked'])

 

 

# C, Q, S, nan이 각각 0, 1, 2, 3임을 알려줌.
le.classes_

 

 


라벨인코딩 관련 메서드:

.value_counts()
시리즈(Series) 객체에서 각 고유한 값의 빈도수를 계산하는 메서드

le.fit_transform():
데이터에 대해 먼저 학습을 수행한 다음, 해당 학습 결과를 바탕으로 변환을 수행하는 LabelEncoding의 메서드.
이러한 방식으로 학습과 변환을 한 번에 수행하므로 코드를 더 간결하게 작성할 수 있음.

 

4-1-3. 원 핫 인코딩(One Hot Encoding)

범주형 변수를 이진 형태로 변환하는 인코딩 방법.

주어진 범주형 변수의 각 범주에 대해 하나의 이진 특성을 만들고,

해당 범주에 해당하는 특성만 1로 표시하고 나머지는 0으로 표시.

# 맨 끝부분에 Embarked_num이라는 라벨 인코딩이 삽입됨.
df['Embarked_num'] = LabelEncoder().fit_transform(df['Embarked'])
df.head()

 

 

pd.get_dummies(df['Embarked_num'])

 

 


원핫인코딩 관련 메서드:

.get_dummies()
pandas 라이브러리에서 제공하는 메서드로, 범주형 변수를 원-핫 인코딩하는 기능을 수행함.
데이터프레임(DataFrame)에서 범주형 변수를 자동으로 인식하고 해당 변수를 원-핫 인코딩된 이진 특성으로 변환할 수 있음.

 

4-1-4. 독립변수와 종속변수 분할

 

feature = ['Sex', 'Fare', 'Age', 'Pclass'] # 독립변수
label = ['Survived'] # 종속변수

df[feature].head()

 

 

df[label].head()

 

 

df[label].value_counts()

 

 

# 학습데이터와 검증데이터를 분할 (넣기 직전의 분할이므로 전처리과정은 이전에 모두 마쳐야 함.)
# 학습데이터(80%), 검증데이터(20%)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df[feature], df[label], test_size=0.2, random_state=10)
# X: 대문자. 관례상 매트릭스형태. y: 소문자. 관례상 스칼라형태. 단일값.

X_train.shape, y_train.shape

 

 

X_test.shape, y_test.shape

 

 

5. 선형회귀

5-1. Rent 데이터셋


Rent 데이터셋 관련 내용 

 * 0   Posted On          : 매물 등록 날짜
 * 1   BHK                : Bed + Hall + Kitchen 갯수
 * 2   Rent               : 렌트비
 * 3   Size               : 집 크기
 * 4   Floor              : 층수
 * 5   Area Type          : 공용공간 포함여부
 * 6   Area Locality      : 지역
 * 7   City               : 도시
 * 8   Furnishing Status  : 풀옵션 여부
 * 9   Tenant Preferred   : 선호하는 가족형태
 * 10  Bathroom           : 화장실 개수
 * 11  Point of Contact   : 연락할 곳(컨택포인트)

 

# 필요한 라이브러리를 import
import numpy as np
import pandas as pd
import seaborn as sns

 

# drive에 mount된 rent.csv 데이터(미국 부동산 매물 리스트)를 불러오기
rent_df = pd.read_csv('/content/drive/MyDrive/K-DT/머신러닝과 딥러닝/rent.csv')
# 따옴표 안의 경로는 본인이 파일을 다운받은 경로를 입력

 

rent.csv
0.54MB

 

rent_df

 

 

rent_df.info()
# 결측치: BHK, SIze에 존재함.

 

 

rent_df.describe()

 

 

# rend_df의 소수점부분을 둘째자리까지 절사
round(rent_df.describe(), 2)

 

 

# BHK 열에 대한 분포를 그래프로 시각화
sns.displot(rent_df['BHK'])

 

 

# Rent 열에 대한 분포를 그래프로 시각화
sns.displot(rent_df['Rent'])

 

 

# df의 렌트비용의 값을 체크
rent_df['Rent'].value_counts()

 

 

# 벗어나는 점이 Outlier일 가능성이 있음.
sns.boxplot(y=rent_df['Rent'])

 

 

# NaN값이 얼마나있는지를 확인
rent_df.isna().sum()

 

 

# 결측치의 퍼센티지 확인 → 결측치의 비율이 낮으므로 데이터를 삭제해도 큰 영향을 주지 않을 것으로 추측.
rent_df.isna().mean()

 

 

# Size의 결측치 데이터 삭제
rent_df.dropna(subset=['Size'])



 

# 결측치가 있는 열을 삭제
rent_df.dropna(1)   = rent_df.drop('BHK', axis=1)

# 1은 '열 전체를 의미하며 BHK, Size열이 모두 삭제됨. 그러나 일반적으로 열을 모두 삭제하는 경우는 없음.

 

 

# inplace=True를 삽입하지 않았기 때문에, 위의 내용은 rent_df에 저장되지 않음.

# rent_df 데이터프레임에서 Size열에서 결측치를 가진 행을 모두 출력
rent_df[rent_df['Size'].isna()]

 

 

 # 'Size' 열이 결측치인 행들의 인덱스를 na_index 변수에 할당
na_index = rent_df[rent_df['Size'].isna()].index
na_index

 

 

# iloc을 사용하여 'Size' 열이 결측치인 행들을 선택. iloc은 정수 기반의 인덱싱을 사용하여 행을 선택.
rent_df.iloc[na_index]

 

 

# 결측치 처리하기
#1. 결측 데이터가 전체 데이터에 비해 양이 굉장히 적을 경우 삭제하는 것도 방법이다.
#2. 결측치에 데이터를 채울 경우 먼저 boxplot을 확인하는 것이 좋음.
sns.boxplot(y=rent_df['Size'])

 

 

# 위의 boxplot에서 위의 소량분포되어있는 데이터들은 outlier로 보지는 않는다. 
# boxplot을 확인하니 mean(평균값)보다는 median(중위값)을 사용하는 것이 좋다고 판단됨.
# rent_df의 결측치를 해당 열의 중위값으로 대체한 결과를 반환함.
rent_df.fillna(rent_df.median()).loc[na_index]

 

 

 # 'BHK' 열이 결측치인 행들의 인덱스를 na_index 변수에 할당
na_index = rent_df[rent_df['BHK'].isna()].index
na_index

 

 

# 'BHK'열의 중위값을 결측치의 자리에 채워넣음

rent_df['BHK'].fillna(rent_df['BHK'].median()).loc[na_index]
# 출력된 값으로 인해 BHK의 중위값이 '2.0'임을 알 수 있음.

 

 

# DataFrame의 결측치 위치에 해당 중위값을 채워넣음
rent_df = rent_df.fillna(rent_df.median())

# 결측치의 제거가 완료된 모습을 확인
rent_df.isna().mean()




결측치는 모두 제거하였으므로, 전처리의 다음 단계인 Dtype의 변경을 진행할 예정

info로 Dtype을 확인한 결과, Area Type의 Dtype이 변경이 필요한 것을 확인.

Area Type은 텍스트형태이기 때문에 모델에서 계산을 할 수 없음.
라벨 인코딩을 통해 숫자로의 변경이 필요.

rent_df.info()

 

 

# Area Type의 value의 종류를 확인.
rent_df['Area Type'].value_counts()

 

 

# [Area Type]의 종류만 단순히 확인하려는 경우
rent_df['Area Type'].unique()

 

 

# [Area Type]의 종류의 갯수만 단순히 확인하는 경우
rent_df['Area Type'].nunique()

 

 

# object형의 value값만 확인하는 방법 → for문에 넣어 순회.
for i in ['Posted On', 'Floor', 'Area Type', 'Area Locality', 'City', 'Furnishing Status', 'Tenant Preferred', 'Point of Contact']:
  print(i, rent_df[i].nunique())

 

 

# 진행에 필요없는 필드값인 Posted On, Floor, Area Locality, Tenant Preferred, Point of Contact 삭제 예정.
rent_df.drop(['Posted On', 'Floor', 'Area Locality', 'Tenant Preferred', 'Point of Contact'], axis=1, inplace=True)
rent_df.info()

 

 

# 원핫인코딩
# Area Type, City, Furnishing Status의 원핫인코딩이 필요 (삭제하고 남은 object들)
rent_df = pd.get_dummies(rent_df, columns=['Area Type', 'City', 'Furnishing Status'])
rent_df

 

 

# 데이터 분할
X = rent_df.drop('Rent', axis=1) # 전체에서 Rent만 제거한 부분( .drop('Rent', axis=1) )이 독립변수.
y = rent_df['Rent'] # Rent가 종속변수.

# 데이터 분할 예정
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=10)
X_train.shape, y_train.shape

 

 

X_test.shape, y_test.shape