빅분기 실기 작업형 2유형(회귀) 이 영상 하나로 끝내세요!
Вставка
- Опубліковано 20 сер 2024
- *깃허브* github.com/JEu...
*전체 코드*
import pandas as pd
df = pd.read_csv('raw.githubuser...)
#print(df.info())
#print(df.head())
#데이터 전처리 (결측값, 라벨인코딩)
df['fuel_type'].fillna(df['fuel_type'].mode()[0], inplace=True)
df['accident'].fillna(df['accident'].mode()[0], inplace=True)
df['clean_title'].fillna(df['clean_title'].mode()[0], inplace=True)
#print(df.info())
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['brand']=le.fit_transform(df['brand'])
df['model']=le.fit_transform(df['model'])
df['milage']=le.fit_transform(df['milage'])
df['fuel_type']=le.fit_transform(df['fuel_type'])
df['engine']=le.fit_transform(df['engine'])
df['transmission']=le.fit_transform(df['transmission'])
df['ext_col']=le.fit_transform(df['ext_col'])
df['int_col']=le.fit_transform(df['int_col'])
df['accident']=le.fit_transform(df['accident'])
df['clean_title']=le.fit_transform(df['clean_title'])
#케이스1 (전체적인 흐름 위주로 작업할 경우)
#df['price']=le.fit_transform(df['price'])
#케이스2 (#목표 변수(price) 문자열 데이터 수치형으로 변환 (기호 제거, 및 데이터 타입 변환))
#★내용 추가★
df['price'] = df['price'].str.replace('$','') # $ 제거
df['price'] = df['price'].str.replace(',','') # , 제거
df = df.astype({'price':'int'}) #데이터 타입 변환
#print(df.info ())
#print(df.head())
#★내용 추가★
#트레인 3800, 테스트 209
train = df.iloc[:3800,:]
test = df.iloc[-209:,:]
#print(train.info())
#print(test.info())
#데이터 분할
from sklearn.model_selection import train_test_split
X = train.drop(columns=['price'])
y = train['price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=10)
#모델링 및 학습
from sklearn.ensemble import RandomForestRegressor
rfr=RandomForestRegressor(n_estimators=120, max_depth=15, random_state=10)
rfr.fit(X_train, y_train)
pred1=rfr.predict(X_test)
#모델 성능평가
from sklearn.metrics import mean_squared_error
import numpy as np
mse = mean_squared_error(y_test, pred1)
#print('mse:', mse) #mse: 121862.20429051273 / mse: 2139040203.4544616
rmse = np.sqrt(mse)
#print('rmse:', rmse) #rmse: 349.0876742173988 / rmse: 46249.75895563632
#최종 결과 예측
test_X_data = test.drop(columns=['price'])
pred2 = rfr.predict(test_X_data)
#결과 제출 및 확인
pd.DataFrame({'price':pred2}).to_csv('result.csv', index=False)
result = pd.read_csv('result.csv')
#print(result)
오늘 시험봤는데 회귀 나왔네요ㅜㅎㅎ MAE를 이용하는 회귀분석이었는데, 다행히 잘 푼 것 같아요. 감사합니다!
기다렸습니다 교수님. 항상 감사합니다.
감사합니다! 많은 도움 되었습니다~!
감사합니다 큰도움됐어요!!!
깃허브에 첫번째 Follower가 되었답니다. :)
곧 후쿠오카도 가고 빅분기도 시험인데 이런 접점이!
ㅋㅋ 좋은 여행되시고 좋은 결과있기를 바랍니다!
어제부터 영상보고 분류 엄청 열심히 복습해서 이제 안보고 할 정도가 되어서 회귀 지금 봤는데
분류를 열심히 하고 오니까 회귀도 거의 비슷한 흐름으로 풀 수 있는 것 같아서 다행이네요
혹시나 분류, 회귀 관련해서 roc auc score나 accuracy score, rmse 같은 평가지표 더 알아두고 공부하면 좋을 만한 건 어떤게 있을까요?
좌절하고 시험 포기할 뻔했던 저에게 차근차근 꼼꼼하게 알려주시는 정말 좋은 영상 올려주셔서 감사합니다!
분류 모델에서 F1 스코어, 회귀모델에서 결정계수 정도 추가적으로 기억해두심 좋을것같아요!
@@aiaiyouknow1063 네 감사합니다!
많은 도움되고 있습니다.! 혹시 17:10 영상에서 자막에 종속변수=독립변수=목표변수라는 게 이해가 안되는데요. 종속변수=목표변수이고 나머지가 독립변수이지 않나요 ㅠㅠ
어머 오타네요! 말씀 주신대로가 맞습니다! 종속변수 = 목표변수 라고 보심되요!
교수님! 저 분류에서는 라벨인코더해도 상관없는데 회귀에서는 라벨인코더하면 큰숫자가 영향이 있을 수 있어서 겟더미 쓰는게 좋다는데 상관없을까요???
네 괜찮습니다. 제가 회귀로 시험봤거든요. ㅋㅋ
강의 감사드립니다 한가지 질문 사항이 있는데 인코딩 시 라벨인코딩,원핫인코딩 방법이 있는 것으로 알고있습니다. 혹시 라벨인코딩,원핫인코딩을 하는 기준이 있을까요? 데이터 형식에 따라 달라지는 건지,, 그냥 교수님께서 하신대로 라벨인코딩으로도 시험에서도 충분히 가능할까요?
라벨인코딩은 텍스트 데이터를 고유의 숫자로 변환해주는 전처리 작업이고, 트리 계열 모델에서는 문제없이 사용이 가능하기때문에 사용한 것입니다.
원핫인코딩은 고유값에 해당하는 데이터를 1로 그렇지 않은 데이터를 0으로 처리해주는 방식이죠. 아마 공부해보셔서 내용은 아실거라고 생각됩니다.
원핫인코딩을 사용할 경우 추가적으로 코드 작업해야하는 부분이 생기기 때문에 저는 라벨인코딩을 사용해서 바로 분석에 사용했던것입니다.
코드 구현 방식에 정답은 없습니다. 다만 최적의 모델을 만들기 위해 다양한 방법들이 있는것이죠.
제가 작성한 코드 이 자체가 절대적이다 이렇게 보지 마시고, 참고용으로 이해해주세요.
@@aiaiyouknow1063 네 답변 감사드립니다!! 저는,, 라벨인코딩으로 가겠습니다..ㅎ
영상 잘봤습니다! 혹시 RMSE가 어느정도 되어야 적당한 값인지는 어떻게 판단할 수 있을까요??
RMSE는 정해진 범위가 있는것이 아니라서 시험때 모델링해서 확인되는 최대한 작은 값으로 제출한다고 생각하심 될거같아요.
강의 감사합니다. ^^ 혹시 price를 라벨인코더가 아니라 달러 표시 등 없애고 FLOAT로 바꿔줘야 하지 않나요? 확인 부탁드려요
(수정) 제가 사용한 데이터는 오픈데이터라 달러표시가 있는 좀 복잡한? 형태이구요. 실제 시험에서는 거의 목표변수는 수치데이터로 제공될거예요!
그래도 데이터를 원본형태로 변환하는 방법을 알아두어야 하기때문에 제가 다시 올려드린 회귀 추가설명 영상을 꼭 참고해주세요!
분류랑 회귀 강의 모두 잘 들었습니다!! 그런데 궁금한 점이 있습니다..!
최종결과 예측 단계에서 분류에서는 test_X = test.drop(columns = ['회원ID']) 이렇게 성별을 제외하고 예측 단계를 실행하는 이유가 뭔가요?
회귀에서는 목표변수인 'price'를 drop 시키는 test_X = test.drop(columns =['price'])로 실행을 하는데 두 개의 차이가 뭔지 알고 싶습니다 ㅠㅠ
분류 영상에서 test 데이터에 '성별'이 있다고 가정한다면 '성별'도 제외하는 것이 맞나요?
Q1. 최종결과 예측 단계에서 분류에서는 test_X = test.drop(columns = ['회원ID']) 이렇게 성별을 제외하고 예측 단계를 실행하는 이유가 뭔가요?
→ 분류에서 회원ID 컬럼은 분석에 직접적인 연관이 없는 컬럼이라 제거한 것입니다. (영상에서도 설명 나올거예요.)
Q2. 회귀에서는 목표변수인 'price'를 drop 시키는 test_X = test.drop(columns =['price'])로 실행을 하는데 두 개의 차이가 뭔지 알고 싶습니다
→ 영상에서 사용한 회귀분석 데이터는 전체 데이터를 잘라서 일부를 Train으로 일부를 Test로 사용했죠?
그러다 보니 Test 데이터에 당연히 목표변수(price)가 포함되어있었고, 그렇기 때문에 이를 제거하고 사용한겁니다.
분류 문제는 Kdata 공개문제로 시험환경과 동일한 데이터를 제공하기때문에 목표변수가 Test 데이터에 포함되어있지 않아서 별도로 처리하지 않았던거구요.
@@aiaiyouknow1063 만약에 회귀 문제에 train과 test로 나누어져 있고,
test에 price칼럼이 없다면 마지막 부분에 test_X = test.drop(columns =['price'])를 안써도 되는건가요?
혹시 이런 상황이면 pred2 = test라서 제출형식에 변수 넣을때 ({'price:test'})로 해도 상관없을까요?
test에 price 컬럼이 없다면 price 컬럼을 제거하는 코드는 별도로 작성하지 않아도 되구요.
그렇다면 pred2= rfr.predict(test)와 같이 되겠죠?
제출형식에는 pd.DataFrame({'price':pred2}).to_csv('result.csv', index=False)와 같이 작업하심됩니다.
@@aiaiyouknow1063 아.. 이해했습니다 감사합니다
영상 정말 감사합니다! 혹시 작업형 3유형도 업로드 예정이시라면, 언제 업로드되는지 여쭈어봐도 괜찮을까요?
3유형 영상 작년 12월에 업로드해두었어요~!
@@aiaiyouknow1063 감사합니다!!
교수님 test 데이터셋 나눌 때, test= df.iloc[3800:4009, : ] 이렇게 해도 되나요?
그렇죠! 맞습니다.
선생님 혹시 RMSE값으로 성능 평가할때 만약 데이터 값의 크기가 커지면 RMSE값도 커지나요? 제가 다른 데이터로 실습을 해보았는데 r2_score는 0.81 나오는데 RMSE값이 5만이나 나오네요... 참고로 랜덤포레스트 모델 썼고 데이터셋 크기는 2만행정도 됩니다.
데이터의 수가 늘어나면 예측해야되는 데이터의 수 또한 늘어나기 때문에 RMSE 수치가 올라갈 수는 있습니다.
다만, 수치가 너무 높게 나온다면 모델을 리모델링 해서 성능을 보완해 보시는게 좋을것 같아요.
@@aiaiyouknow1063 덕분에 80점으로 합격했습니다! 2유형은 만점 받았네요! 감사합니다~
@minsungkang8879 와! 너무너무 츅하드립니다! 😄 고생많으셨어요!
@@aiaiyouknow1063 복받으실거에요😀
소리가 너무 작아요.
엇 저는 잘 들리는걸로 확인이 되는데 음량을
한번 조절해보시겠어요?
다른 유투브영상에 비해 소리가 작아서 이거다듣고 다른 유투브 틀면 귀청떨어질뻔 하긴해요ㅋㅋ
@@yuyuyu-ci4sb 앜ㅋㅋ 죄..죄송합니다.
강의 감사합니다! 궁금한점 몇개 여쭤보겠습니다...
1. 혹시 원핫인코딩 대신 라벨인코더를 사용하시는 이유가 트리계열 ML알고리즘일 경우 숫자의 특성을 반영하지 않아서인지 궁금합니다! 공부하면서 여러가지 코드를 확인하고 있는데 pd.get_dummies라는 원핫인코딩을 많이 사용하는것 같더라구요(편해서 사용하는것 같기는 한데).
2. 매우 드문경우에 train과 test데이터 셋에 각각 원핫인코딩(pd.get_dummies)를 사용하면 열이 같지 않아 랜덤포레스트 함수에 오류가 발생하더라구요. 제가 코드에서 찾아보았을때는 train.describe(include = 'O')에서 열의 unique값과 test.describe(include = 'O')에서 열의 unique값이 달라서 발생한다고 생각하는데 맞나요...?
덕분에 빅분기 준비하는데 많은 도움이 되고있습니다. 강의 올려주셔서 너무 감사합니다!
1. 네 맞습니다.
2. 저는 주로 라벨인코딩으로 작업을 했었는데요.각각 인코딩을할 경우 고유 라벨이 다를때 간혹 오류가 발생할 수 있기는 합니다. 제가 영상에 각각 인코딩한것을 보여드린것 또한 하나의 방법이구요. 인코딩 방법은 여러가지가 있으니 참고하셔서 코드 작성하심 될것같아요. 참고로 제 경험상 트레인 테스트 각각 문자열 데이터를 라벨인코딩 했을때 문제가 되는 요인은 없었기에 그렇게 설명드렸어요!
@@aiaiyouknow1063 감사합니다!
강의 감사합니다 ㅎ ㅎ
#트레인 3800, 테스트 209
train = df.iloc[:3800,:]
test = df.iloc[-209:,:]
#print(train.info())
#print(test.info())
#데이터 분할
from sklearn.model_selection import train_test_split
X = train.drop(columns=['price'])
y = train['price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=10)
위에서 train, test 나누어 주었는데 왜 train_test_split으로 또 나눠 주는 걸까요?
위에 나뉜 train, test 데이터는 제가 사용한 데이터 자체가 학습, 테스트로 나뉘어져 있지 않기 때문이고, 실제 시험에서는 train, test 이렇게 데이터가 제공되기 때문에 시험과 유사한 환경에서 실습을 하기 위한것입니다.
아래의 train_test_split 는 train데이터를 활용하여 모델링 및 검증을 해야하니 데이터를 나눈것이구요. 헷갈리시면 안됩니다!