학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 import pandas as pd train = pd.read _csv("data/customer_train.csv") test = pd.read _csv("data/customer_test.csv") # print(train.shape,test.shape) #2482 # print( train.info (), test.info ()) # print(train.isnull().sum()) # 결측값 존재함 # print(test.isnull().sum()) # 결측값 존재함 # 전처리 train = train.fillna(0) test =test.fillna(0) # print(train.isnull().sum()) # print(test.isnull().sum()) target = train.pop('성별') df= pd.concat([train,test]) df = pd.get_dummies(df) train = df.iloc[:len(train)] test = df.iloc[len(train):] print(train.shape,test.shape) # 모델 분리 및 검증 from sklearn.model_selection import train_test_split X_tr,X_val,y_tr,y_val = train_test_split(train,target,test_size=0.2,random_state=22) # print(X_tr.shape,X_val.shape,y_tr.shape,y_val.shape) # 모델 학습 from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(random_state=22) rf.fit (X_tr,y_tr) pred = rf.predict_proba(X_val) # 결과 pred = rf.predict_proba(test) submit = pd.DataFrame({'pred':pred[:,1]}) submit.to _csv('result.csv',index=False) print( pd.read _csv('result.csv').head()) print( pd.read _csv('result.csv').shape) #2482 이 식으로 풀어도 될까요??
Error: async/await is not yet supported in Client Components, only Server Components. This error is often caused by accidentally adding 'use client' to a module that was originally written for the server. 이라는 에러가 뜨고 유저리스트가 빈배열 리턴되는데 이런 경우 어떻게 처리해야하나요?
과제. 직접 retention 구해보기(주별 weekly) WITH base AS ( SELECT DISTINCT user_id, user_pseudo_id, event_name, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM advanced.app_logs WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ), first_week_and_diff AS( SELECT *, -- DATE_DIFF(event_date, first_date, DAY) AS diff_of_day, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, event_date, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ), user_cnt_and_diff AS( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY ALL ORDER BY diff_of_week ), retain_base AS ( SELECT *, FIRST_VALUE(user_cnt) OVER (ORDER BY diff_of_week) AS first_user_cnt FROM user_cnt_and_diff ) SELECT diff_of_week, ROUND(SAFE_DIVIDE(user_cnt, first_user_cnt), 2) AS retention FROM retain_base 과제. 월별 리텐션 쿼리 작성해보기 WITH base AS ( SELECT DISTINCT user_id, user_pseudo_id, event_name, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM advanced.app_logs WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ), first_month_and_diff AS( SELECT *, -- DATE_DIFF(event_date, first_date, DAY) AS diff_of_day, -- DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week DATE_DIFF(event_month, first_month, MONTH) AS diff_of_month FROM ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), MONTH) AS first_month, event_date, DATE_TRUNC(event_date, MONTH) AS event_month FROM base ) ), user_cnt_and_diff AS( SELECT diff_of_month, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_month_and_diff GROUP BY ALL ORDER BY diff_of_month ), retain_base AS ( SELECT *, FIRST_VALUE(user_cnt) OVER (ORDER BY diff_of_month) AS first_user_cnt FROM user_cnt_and_diff ) SELECT diff_of_month, user_cnt SAFE_DIVIDE(user_cnt, first_user_cnt) AS retention FROM retain_base 리텐션 연습문제 Weekly Retention을 구하는 쿼리를 바닥부터 스스로 작성해보세요. # 답 -- Weekly Retention을 구하자! (Retention이란, 시간이 흐르면서 다시 제품을 사용하는지 측정하는 지표) -- 첫 방문 후 매주 재방문 비율(weekly retention)을 계산하자! WITH base AS ( SELECT DISTINCT ###### DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime, event_name, user_id, ###### user_pseudo_id FROM advanced.app_logs WHERE event_date BETWEEN "2022-08-01" AND "2023-08-31" ), event_week_and_first_week AS ( SELECT DISTINCT DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week, user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id ORDER BY event_date), WEEK(MONDAY)) AS first_week FROM base ), retention_base AS ( SELECT *, FIRST_VALUE(user_cnt) OVER(ORDER BY day_of_week) AS total_user FROM( SELECT DATE_DIFF(event_week, first_week, WEEK) AS day_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM event_week_and_first_week GROUP BY ALL ) -- ORDER BY day_of_week ) SELECT day_of_week, SAFE_DIVIDE(user_cnt, total_user) AS retention FROM retention_base Retain User를 New + Current + Resurrected + Dormant User로 나누는 쿼리를 작성해보세요 # 답 -- 신규 유저: 첫 활동일 기준 7일 이내 -- 기존 유저: 첫 활동일 기준 7일 이후, 마지막 활동으로부터 90일 이내 -- 휴면 유저: 마지막 활동일 이후 90일 이상 경과 -- 복귀 유저: 90일 이상 비활성화 이후 다시 돌아온 유저 WITH base AS ( SELECT DISTINCT DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, user_pseudo_id FROM advanced.app_logs --WHERE event_date BETWEEN "2022-08-01" AND "2023-08-31" ),user_first_last AS ( SELECT user_pseudo_id, MIN(event_date) AS first_date, #OVER(PARTITION BY user_pseudo_id)를 넣으면 윈도우함수사용과 GROUPBY졸 사용 비교했을 때처럼 중복행이 생긴다 MAX(event_date) AS last_date FROM base GROUP BY user_pseudo_id ), last_event_date AS ( -- 원래라면 CURRENT_DATE()로 해야하지만, 앱로그 데이터의 마지막 날로 설정. SELECT MAX(event_date) AS current_date FROM base ), user_activity AS ( -- 90일 이상 제품을 사용하지 않았다면 1, 아니면 0 SELECT user_pseudo_id, event_date, LEAD(event_date) OVER (PARTITION BY user_pseudo_id ORDER BY event_date) AS next_event_date, CASE WHEN DATE_DIFF(LEAD(event_date) OVER (PARTITION BY user_pseudo_id ORDER BY event_date), event_date, DAY) > 90 THEN 1 ELSE 0 END AS dormant_history FROM base ) -- user_types AS ( SELECT DISTINCT u.user_pseudo_id, u.first_date, u.last_date, led.current_date, us.dormant_history, CASE WHEN DATE_DIFF(led.current_date, u.last_date, DAY) > 90 THEN 'dormant_user' WHEN DATE_DIFF(u.last_date, u.first_date, DAY) <= 7 THEN 'new_user' WHEN dormant_history = 1 THEN 'resurrected_user' ELSE 'current_user' END AS user_type FROM user_first_last AS u CROSS JOIN last_event_date AS led LEFT JOIN user_activity AS us ON u.user_pseudo_id = us.user_pseudo_id 주어진 데이터에서 어떤 사람들이 리텐션이 그나마 높을까요? 찾아보세요 WITH base AS ( SELECT DISTINCT DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, user_pseudo_id FROM advanced.app_logs ), user_first_last AS ( SELECT user_pseudo_id, MIN(event_date) AS first_date, MAX(event_date) AS last_date FROM base GROUP BY user_pseudo_id ), last_event_date AS ( SELECT MAX(event_date) AS current_date FROM base ), user_activity AS ( SELECT user_pseudo_id, event_date, LEAD(event_date) OVER (PARTITION BY user_pseudo_id ORDER BY event_date) AS next_event_date, CASE WHEN DATE_DIFF(LEAD(event_date) OVER (PARTITION BY user_pseudo_id ORDER BY event_date), event_date, DAY) > 90 THEN 1 ELSE 0 END AS dormant_history FROM base ), user_types AS ( SELECT u.user_pseudo_id, u.first_date, u.last_date, led.current_date, MAX(us.dormant_history) AS dormant_history, CASE WHEN DATE_DIFF(led.current_date, u.last_date, DAY) > 90 THEN 'dormant_user' WHEN DATE_DIFF(u.last_date, u.first_date, DAY) <= 7 THEN 'new_user' WHEN MAX(us.dormant_history) = 1 THEN 'resurrected_user' ELSE 'current_user' END AS user_type FROM user_first_last AS u CROSS JOIN last_event_date AS led LEFT JOIN user_activity AS us ON u.user_pseudo_id = us.user_pseudo_id GROUP BY u.user_pseudo_id, u.first_date, u.last_date, led.current_date ), first_week_and_diff AS ( SELECT ut.user_type, fw.user_pseudo_id, fw.event_date, DATE_DIFF(DATE_TRUNC(fw.event_date, WEEK(MONDAY)), DATE_TRUNC(ut.first_date, WEEK(MONDAY)), WEEK) AS diff_of_week FROM base AS fw JOIN user_types AS ut ON fw.user_pseudo_id = ut.user_pseudo_id ), user_cnt_by_type_and_week AS ( SELECT user_type, diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY user_type, diff_of_week ), retention_base AS ( SELECT user_type, diff_of_week, user_cnt, FIRST_VALUE(user_cnt) OVER (PARTITION BY user_type ORDER BY diff_of_week) AS first_user_cnt FROM user_cnt_by_type_and_week ) SELECT user_type, diff_of_week, ROUND(SAFE_DIVIDE(user_cnt, first_user_cnt), 2) AS retention_rate FROM retention_base ORDER BY user_type, diff_of_week current user의 1주차 리텐션은 0.11부터 시작해서 5~6주차에는 0.15까지 오릅니다. new user의 경우 1주차까지 밖에 리텐션을 구하지 못하고, 0.06입니다. resurrected user의 경우 1주차 리텐션은 0.04부터 시작해서 7주차에는 0으로 빠르게 감소합니다. dormant user의 경우 휴면고객의 리텐션을 구하는 것이 의미가 있는지 잘 모르겠지만, 1주차 리텐션은 0.05부터 시작해서 11주차까지 0으로 감소합니다. 리텐션이 그나마 높은 유저는 current user이고, 리텐션이 주마다 서서히 증가하거나 감소하는데 2주차에 오른 것으로 보아 기능 배포나 이벤트가 있지 않았을까 예상해봅니다. Core Event를 “click_payment”라고 설정하고 Weekly Retention을 구해주세요 WITH base AS ( SELECT DISTINCT DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime, event_name, user_id, user_pseudo_id FROM advanced.app_logs WHERE event_name = "click_payment" ), event_week_and_first_week AS ( SELECT DISTINCT DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week, user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id ORDER BY event_date), WEEK(MONDAY)) AS first_week FROM base ), retention_base AS ( SELECT *, FIRST_VALUE(user_cnt) OVER(ORDER BY day_of_week) AS total_user FROM ( SELECT DATE_DIFF(event_week, first_week, WEEK) AS day_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM event_week_and_first_week GROUP BY day_of_week ) ) SELECT day_of_week, ROUND(SAFE_DIVIDE(user_cnt, total_user), 2) AS retention FROM retention_base ORDER BY day_of_week app_logs 테이블에서 event_name이 click_payment인 것만 필터 걸어서 리텐션 구하기를 진행했는데 이렇게 푸는 것이 맞을까요..?
from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(random_state = 0, max_depth = 3, n_estimators = 200) model.fit(X_tr, y_tr) pred_proba = model.predict_proba(X_val) from sklearn.metrics import roc_auc_score print(pred_proba) print(roc_auc_score(y_val, pred_proba[:, 1])) 안녕하세요, 모델학습 후 검증하려고 하니 print(roc_auc_score(y_val, pred_proba[:, 1]))에서 아래와 같은 오류가 발생합니다. list indices must be integers or slices, not tuple 혹시 pred_proba의 형태에 문제가 있어서 그러나 출력해봤더니 아래처럼 array가 2개가 뜨는데 원래 출력되던 값이랑 다른 것 같기도 한데 어떤 부분이 잘못된걸까요..? [array([[6.17771951e-04, 3.90720727e-04, 5.61044129e-04, ..., 1.88014875e-05, 2.71602426e-05, 9.26113606e-05], [4.72241735e-04, 7.55194719e-04, 3.70085375e-04, ..., 7.58005053e-06, 2.24283166e-05, 3.95537961e-05], [2.06135825e-05, 1.04454196e-05, 1.96540881e-06, ..., 2.93436306e-05, 1.84382330e-05, 6.98070487e-05], ..., [2.26718012e-05, 2.39307053e-05, 1.96540881e-06, ..., 3.02043842e-05, 1.54553261e-05, 6.62548451e-05], [1.51536674e-05, 2.15648698e-05, 2.06815630e-06, ..., 4.15875993e-05, 3.06270026e-05, 3.26545900e-05], [2.84102759e-05, 1.47138847e-05, 6.29396294e-06, ..., 3.17093190e-05, 1.71020727e-05, 4.92247989e-05]]), array([[0.05156594, 0.94843406], [0.0402204 , 0.9597796 ], [0.54197093, 0.45802907], ..., [0.53420482, 0.46579518], [0.5344612 , 0.4655388 ], [0.53436829, 0.46563171]])] @ 위 문제를 기존에는 y_train의 'ID' 값을 drop하지 않았다가, y_train의 'ID' 값을 drop하니 해결되었는데 그것과 관련이 있는 것일까요? 그리고, 'ID'값을 제거하려고 할 때에는 X_train, y_train, X_test 세 데이터 프레임 모두의 'ID'값을 반드시 제거해야 하는 것인가요?
검증 데이터 분리 시, X_tr ~ = train_test_split( train.drop('output', axis=1) 에서 전단계에서 데이터 전처리 할 때, 이미 train에서 output 드랍하고 train에 저장했는데 (train = train.drop('output')) 검증 데이터 분리 작성 시 다시 drop 해주는 이유가 있나요? X_tr ~ = train_test_split( train) 이렇게 바로 하면 안되나요?
안녕하세요! 명목형 자료의 인코딩 시 Test 데이터에만 있는 Unique 값이 있을 수 있어 데이터를 합치고 인코딩 한 후에 다시 분리하는 것으로 이해하였습니다. 예시에 사용된 원핫인코딩의 pd.get_dummies와 달리 라벨인코딩의 경우 사이킷런의 인코더를 이용하는데, 이에 따라 fit_transform, transform으로 나누어 진행하는 것 같습니다. 질문은! 라벨인코딩의 경우에 Train, Test 데이터를 합쳐서 인코딩 할 때 fit_transform을 사용하면 될까요?
안녕하세요! 결측치 처리 시에 아래와 같이 수치형 컬럼의 경우 Train 데이터의 평균, 중앙값을 Test 데이터 결측치 처리에 사용한 반면, 명목형 컬럼의 경우 Test 데이터 결측치 처리 시에 Test 데이터의 최빈값을 이용한 이유가 궁금합니다! 통상적으로 이렇게 진행되는 것인지, 아니면 해당 데이터셋의 경우 Train 데이터와 Test 데이터의 최빈값이 동일해서 단순히 이렇게 처리된 것인지 궁금합니다! # X_train데이터 X_train['workclass'] = X_train['workclass'].fillna(X_train['workclass'].mode()[0]) X_train['native.country'] = X_train['native.country'].fillna(X_train['native.country'].mode()[0]) X_train['occupation'] = X_train['occupation'].fillna("X") X_train['age'] = X_train['age'].fillna(int(X_train['age'].mean())) X_train['hours.per.week'] = X_train['hours.per.week'].fillna(X_train['hours.per.week'].median()) # X_test데이터 X_test['workclass'] = X_test['workclass'].fillna(X_test['workclass'].mode()[0]) X_test['native.country'] = X_test['native.country'].fillna(X_test['native.country'].mode()[0]) X_test['occupation'] = X_test['occupation'].fillna("X") X_test['age'] = X_test['age'].fillna(int(X_train['age'].mean())) X_test['hours.per.week'] = X_test['hours.per.week'].fillna(X_train['hours.per.week'].median())
조건 대륙('continent')별 맥주 소비량(‘beer_servings’)의 평균을 계산하고, 평균이 가장 큰 대륙을 찾으시오. 1번에서 찾은 대륙에서 맥주 소비량이 5번째로 많은 국가(‘country’)의 맥주 소비량을 구하시오. 이 문제를 풀 때 정답과는 조금 다르게 풀었는데 단순히 답만 나오면 상관 없나요 ? 선생님이 풀이해주신 걸 보면, 별도의 변수를 만들어 대입 후 비교를 하셨는데, 저같은 경우는 데이터프레임에 바로 대입을 하고, 1번 조건이 Europe인 것을 확인 후 주석처리를 했습니다. # df = df.groupby('continent').mean('beer_servings') # df = df.sort_values('beer_servings',ascending = 0) # 평균 가장 큰 대륙 : Europe cond = df['continent'] == 'Europe' df = df.sort_values('beer_servings', ascending = 0) print(df.iloc[4, 1]) 이후 조건 변수에 대입 후 313 답을 도출했는데, 이렇게 풀면 틀릴까요 ?
안녕하세요 선생님, 강의 잘 듣고 잇습니다. 머신러닝 분석 절차는.. (1) train 데이터를 tr과 val로 분리 (2) tr 데이터로 학습 (3) val 데이터로 성능평가 (4) 그리고 test 데이터로 예측결과 제출 위 순서인 것으로 이해했는데, (4)번에서 train(tr+val) 데이터가 아닌 tr 데이터로 학습한 것을 바탕으로 예측한 결과를 제출하는건가요? train(tr+val) data로 다시 학습한 후에 예측하지 않아도 되는 것인지 궁금합니다.
지금 데이터를 보면 Roof 데이터에 수치형과 범주형이 동시에 존재하는데 저는 범주형 데이터를 라벨인코딩 진행 후 , 데이터분할, 랜포돌림, 그리고 마지막으로 예측하려고하니 다음과 같이 나왔습니다. 에러 내용을 보니... test데이터에 존재하는 object 때문에 이러한 문제가 발생하는 것 같은데... 이처럼 하나의 열에 수치형, 범주형이 동시에 존재하면 이 경우에는 원-핫인코딩을 쓰는게 더 나을까요?
제가 작업형2를 학습중인데 모르는 부분이 생겨서 질문드립니다. 작업형2에서 EDA를 진행할 때 기초통계값에서는 어떠한 부분을 확인하나요? RobustScaler나 MinMaxScaler같은 전처리 함수는 수치형데이터를 전처리할 때 사용하는 함수인가요? 그렇다면 기출8회 작업형2에서는 왜 LabelEncoder만 진행을하고 수치형데이터에는 따로 전처리를 진행하지 않은건가요? 기출8회 작업형2에서 customerID를 제거하던데 왜 ID값들은 제거해야하나요? 질문 답변해주시면 감사하겠습니다!!
안녕하세요, 강의 잘 듣고 있습니다! 12강까지는 다른 유저의 게시물이 잘 보이고, 피드 상단 선택 시 프로필까지 잘 넘어갔었는데, 13강을 끝까지 듣고 코드 작성 후 빌드를 했더니 아래 화면처럼 유저의 데이터가 불러와지지 않고, 프로필로 이동도 안되며 어떤 동작도 하지 않습니다 ㅜㅜ FeedCellView에서 계속 ProfileViewModel(user: user) 을 생성하는 부분에서 문제가 되는 것 같은데,, 어떻게 해결해야 할 지 모르겠습니다. 아래 오류 이미지도 첨부하겠습니다. 감사합니다