소개
데이터 사이언티스트 김동규입니다.
현재 AI연구원으로 재직하고 있습니다.
강의
수강평
- 한 방에 끝! 빅데이터분석기사 실기 작업형
- 한 방에 끝! 빅데이터분석기사 실기 작업형
- 한 방에 끝! 빅데이터분석기사 실기 작업형
게시글
질문&답변
Futurewarning 에러 관련해서 문의드립니다
안녕하세요 이준혁님!말씀하신 사항은 코드 실행에 있어서 문제가 없으며 이에 대한 사항은 사전에 진흥원에 질의응답을 마쳐놓았습니다.warning은 현재 코드에 주의할 점이 있지만 실행은 정상적으로 이뤄진다는 뜻이니 걱정하지 않으셔도 됩니다.감사합니다.
- 0
- 1
- 517
질문&답변
성능확인 질문
안녕하세요, wjsgns745님!질문주셔서 감사합니다.질문주신 부분의 코드는 실제 시험환경에서는 존재하지 않는 '정답' 데이터입니다.또한 기본적으로 강의에서 제안하는 '실압코'에서는 Holdout과 같은 과정이 생략되어 있는데요,그 이유는 이렇습니다.1 ) Holdout을 뺌으로써 split, validation&tuning cycle 생략2) 더 적은 코드를 외워도 됨으로써 긴장되는 시험환경에서 보다 쉽게 적용다만 Holdout을 진행하지 않음으로서 제가 제안드린 풀이방법이 실제로 성능이 어떻게 되는지 궁금하거나, 성능이 충분하지 않을까봐 불안하실 수 있습니다.이러한 이유로 위와 같이 성능을 증명하는 코드를 추가한 것입니다.만약 다소의 여유가 있어 holdout과 ensemble 등의 과정을 적용하고 싶으시다면,시험 환경에서 제시되는 train data를 split해 학습용과 평가용 데이터로 나눈 뒤(Holdout),학습용 데이터에 대해 학습시킨 뒤 평가 데이터셋을 통해 제시된 평가지표로 평가해보며,성능이 좋은 모델을 선택하고, 앙상블의 비율을 바꿀 수 있습니다.하지만 그동안의 시험 경향과 제한된 환경으로 인해 굳이 시험환경에서는 홀드아웃이나 별도의 튜닝없이 실압코만 잘 적용해도 충분히 만점을 받으실 수 있으니, 이를 중심으로 작업1유형에 더 집중하시는 것을 추천드립니다.감사합니다.
- 0
- 1
- 180
질문&답변
기출 문제 풀이 질문
안녕하세요, blair님! 질문주셔서 감사합니다.우선 해당 부분은 조금 깊은 내용일 수 있는데요, 간단히 말씀드리면 pandas 라이브러리의 내부 매서드(groupby, sort_values 등)를 통해 출력되는 결과물은 원본에 영향을 주지 않는 새로운 결과물이기에 그렇습니다. 때문에 해당 결과물을 보여주기만 할뿐, 원본 데이터와는 독립적인 별개의 것입니다.때문에 이러한 기능을 사용한 데이터를 그대로 사용하고 싶다면 해당 메서드를 사용한 값을 변수명으로 지정해 사용하거나, 내부 파라미터 중 inplace=True를 이용해 원본 데이터까지 수정해야 합니다.그로 인해 해답 코드로 제시한 과정에서는 df2에 새로운 정렬기준을 적용한 데이터프레임을 지정한 후, 이를 이용해 진행한 것입니다.만일 새로운 데이터로 지정하지 않고 사용하고 싶으시다면 다음과 같이 사용할 수도 있습니다.df = pd.read_csv("https://raw.githubusercontent.com/leadbreak/inflearn_lecture/main/datasets/%EA%B8%B0%EC%B6%9C02/1_1.csv") df.sort_values(by=['CRIM'], ascending=False, inplace=True, ignore_index=True) df['CRIM'][:50] = min(df['CRIM'][:50]) print(df[df['AGE'] >= 90 ]['CRIM'].mean()) 또한 추가적으로 최소값으로 대체하는 과정에서 해당 값을 min으로 지정하셨는데요. 이는 직관성의 측면에선 아주 훌륭할 수 있지만 동일한 이름의 메서드가 다수 존재하며,이를 변수명으로 지정했을 때 이후 다른 작업 과정에서 해당 메서드가 정상적으로 작동하지 않을 수도 있습니다. 이러한 문제는 추후 실무에서 모델링을 하거나, 취업을 위한 코딩테스트에서도 빈번하게 발생하는 실수이기에 주의가 필요하다는 것 말씀드리며 답변 마치겠습니다.감사합니다.
- 0
- 1
- 219
질문&답변
predict 와 predict_proba 차이
안녕하세요 mouse님!질문주신 사항 답변드리겠습니다.predict는 각각의 모델의 최종적인 예측값을 출력하는 결과인데요.회귀 모델의 경우 0.98733...과 같이 구체적으로 특정 값을 출력하게 되고,분류 모델의 경우 0, 1, 2와 같이 가장 확률이 높은 클래스를 출력하게 됩니다.그리고 이때 분류 모델이 각 클래스에 대한 확률을 일일히 출력하는 것이 predict_proba 입니다.(predict_proba는 predict probability, 즉 각 클래스의 확률을 예측하라는 의미입니다)따라서 회귀 모델에는 predict_proba를 사용할 수 없으며, 출력되는 값은 다음과 같습니다.[클래스가 3개인 문제를 풀 경우]Input -> [클래스 0일 확률, 클래스 1일 확률, 클래스 2일 확률]당연히 여러 개의 input을 넣을 경우 그 input만큼의 각 클래스 확률을 출력하게 됩니다.따라서 강의안에서 제시된 predict_proba[:,1]과 같은 방식은 이진분류 문제일 때, 회귀문제를 분류모델을 통해 푸는 방식을 뜻하며 이는 곧 1일 확률(&0이 아닐 확률)이기 때문에 이렇게 사용됩니다. 그리고 다중분류일 때 쓰는 방법에 대해서도 질문주셨는데요.단순히 다중분류 모델을 사용해서 0, 1, 2 중 하나를 출력하는 방법이 있으며,이를 predict_proba로 출력한 이후 일정값 이하인 경우 필터링해 사용하기도 합니다.위 방법을 사용하기 위해선 np.argmax를 통해 각 row별 최대값의 index를 구한 후 해당 값이 기준치 이상인지를 따진 후 출력하는 방식을 사용합니다. 추가적으로 궁금하신 사항이나, 위 답변으로 해결되지 못한 부분이 있다면 다시 질문주시면 최대한 빠르게 답변드리도록 하겠습니다.감사합니다.
- 0
- 1
- 10K
질문&답변
다중분류 데이터가 숫자가 아닐경우
안녕하세요, mouse님!질문해주신 사항처럼 종속값이 숫자가 아닌 명목형 변수와 같은 형태라면 회귀 모델이 정상적으로 작동하지 않습니다.때문에 이러한 경우에는 분류 모델을 사용하거나, 해당 명목형 변수에 대응하는 숫자값으로 바꿔준 뒤 예측한 값을 가장 가까운 명목형 변수와 매칭시키는 과정이 필요하게 됩니다.이와 관련해 명목형 변수를 숫자형 변수로 바꿔준 뒤,회귀로 예측하고, 이를 다시 맵핑시키는 코드를 공유드릴까 했지만애초에 질문해주신 방식은 회귀적으로 풀기에 적합하지 않으며시험 합격 목적으로나 다른 공모전을 목적으로 해도 사용하지 않을 단순 기술적인 부분이기에넘어가도록 하겠습니다.다만 만약 맵핑시키는 과정이 궁금하시다면 본 강의의 map과 lambda를 이용한 맵핑을 참고하시거나 추가 질문주시면 따로 공유드리도록 하겠습니다.감사합니다.
- 0
- 1
- 233
질문&답변
기출 정답 문의
안녕하세요, abc님!좋은 질문 감사드립니다.제가 미처 확인하지 못한 오류였네요, 말씀하신 사항이 맞습니다.최소값을 위해 mean이 아닌 min을 사용해야 하고, loc를 이용한 슬라이싱은 칼럼명으로 하든, 숫자로 하든 끝값을 포함하게 됩니다.때문에 이를 적절하게 풀게되면 다음과 같이 진행되게 됩니다.(loc를 이용해서 할 경우 직관적이지 않아 혹여나 저같은 실수를 할까싶어, 간단한 슬라이싱으로 작업했습니다)(사진)중간중간 작성한 코드를 확인하며 꼼꼼하게 학습하시는 것을 보니 좋은 결과가 기대됩니다.다시금 좋은 질문 감사드리며, 좋은 일 가득하시길 빌겠습니다~
- 1
- 1
- 192
질문&답변
질문드립니다.
안녕하세요, 가람님. 확인해본 결과 위의 코드는 크게 두 가지 부분에서 경고가 발생한 것인데요. 첫 번째는 6번째 줄 y_test = X_test[['cust_id']]를 하는 부분에서 발생한 경고입니다. 이후 로직에서 이로 인한 문제가 발생할 여지는 없으나, 만일 해당 이유를 알고 싶으시다면 [섹션4] 머신러닝 강의 중간의 부록으로 만들어진 깊은 복사와 얕은 복사 라는 제목의 강의를 통해 확인하시면 됩니다. 또한 이러한 경고창은 기존의 코드를 다음과 같이 수정하면 뜨지 않게 됩니다. y_test = X_test[['cust_id']] y_test = X_test[['cust_id']].copy() 이에 대해서는 노션의 실압코 부분에도 수정해놓았습니다. 두 번째로는 해당 환경에서 xgboost가 정상적으로 설치되지 않아 발생한 오류입니다. 분명 제가 강의를 기획하고 테스트해볼 때까지는 정상적으로 실행되었던 코드이나, 아무래도 중간에 업데이트를 했거나 혹은 해야할 것을 하지 않아 발생한 오류로 보입니다. 이를 개선하기 위해서는 xgboost 라이브러리를 재설치하거나, 버전 업그레이드를 해야하는데 이는 수험자 입장에서 진행할 수 없는 부분이기 때문에 해당 환경에서 당장 xgboost를 테스트해보긴 어려울 것 같습니다. 실제 시험환경에서는 이와 같은 일이 없도록 아래와 같이 공식적으로 문의를 넣어놓은 상태이며, 다른 환경에서 테스트해본 결과 전체 코드의 로직이나 결과에는 문제가 없음을 확인하였습니다. 감사합니다. (사진)
- 0
- 3
- 309
질문&답변
질문드립니다.
안녕하세요, 김가람님! 우선 코드 실행에 있어 어떤 문제가 있다며 뜨는 경우는 크게 두 가지가 있는데요 하나는 에러(Error), 하나는 경고(Warning)입니다. 에러(Error)의 경우엔, 반드시 고쳐야 하는 경우로써 정상적으로 코드가 실행되지 않음을 의미합니다. 반면 경고(Warning)의 경우엔, 고치는 것을 권장하는 사항에 대해 언급될뿐 코드는 정상적으로 작동함을 의미합니다. 또한 위에 뜬 경고문을 읽어보건데, 미래의 버전에서는 해당 방식의 인덱싱이 없어질 것이기에 지금 당장은 괜찮지만 만약 버전이 바뀐다면 이를 수정해야 한다고 합니다. 즉, 이후의 버전에서는 지금의 경고가 에러로 바뀔 수 있음을 의미하는 것입니다. 작성하신 전체 코드를 확인할 수 없어 구체적으로 어떤 부분에서 경고가 발생했는지는 어려우나, 아무래도 스케일링이나 학습 데이터로 나누는 과정에서 해당 경고가 발생하지 않았나 싶습니다. 만일 해당 경고가 왜 발생했는지 자세히 알고 싶으시다면 작성하신 전체 코드와 경고창을 찍어 주시면 답변드리도록 하겠습니다. 감사합니다.
- 0
- 3
- 309
질문&답변
질문 드립니다. Quiz 답안의 실행시 에러 발생원인을 알고 싶습니다.
안녕하세요, Jongdeok Heo님! 아마도 pandas beginner #1에서 위와 같은 문제가 발생한 것으로 보입니다. 위 출력 결과는 해당 데이터 프레임이 비어있음을 의미합니다. 아무래도 데이터 프레임을 불러오신 것이 아니라, 직접 칼럼과 데이터를 입력으로 주고 사용한 것이 아닌가 싶습니다. 때문에 colab의 해당 데이터를 다음과 같이 클릭해 다운로드하고, 불러와 사용하시면 보다 편하게 학습하실 수 있을 것 같습니다! (사진) 위 이미지처럼 우선 코랩에 연결한 후, 왼쪽의 작업 폴더를 열어, sample data 폴더 안의 우리가 학습용으로 사용하는 데이터를 다운로드 해주시면 됩니다. 그 이후에는 작업하는 파이썬 코드와 같은 폴더 안에 넣은 뒤 다음과 같이 불러와 사용하시면 됩니다. import pandas as pd pd.set_option('display.max_columns', None) df = pd.read_csv("./california_housing_train.csv") print(df) df1 = df[df.isnull() == True] print(df1) 만약 위 답이 질문에 대한 적절한 답이 되지 못했다면 댓글이나 추가 질문으로 남겨주시면, 다시 답변드리도록 하겠습니다. 이른 아침부터 공부하고 질문을 남기시다니 아주 멋지시네요! 감사합니다.
- 0
- 3
- 320
질문&답변
pandas beginner #2 질문 있습니다!
안녕하세요, 정연님. 답변드립니다. # 1. 두 코드의 차이 - 슬라이싱에는 크게 두 가지 방식이 있습니다. - 하나는 특정 열을 가져오는 것, 다른 하나는 특정 행을 가져오는 것입니다. - 각 행이나 열의 이름이나 index를 통해 바로 가져오는 방법이 있고, - 조건문을 통해 True에 해당하는 행이나 열만을 가져오는 방법이 있습니다. - 이러한 두 방법을 동시에 사용하거나 중복적으로 사용하는 것도 가능합니다. - 위 두 코드의 경우, 하나는 열의 이름을 통해 불러온 상태에서 행의 조건문을 통해 조회하는 것과 행의 조건문을 조회한 후 열의 이름을 불러오는 것의 차이이며 결과적인 차이는 없습니다. - 이후 배우게 될 조건문에는 하나의 대괄호 안에 여러 조건문을 사용하거나, iloc, loc 안에 조건문을 포함시키는 등의 다소 복잡할 수 있는 스킬을 배우시게 될텐데요. 그때에도 지금 하시는 것처럼 여러 조건을 하나의 대괄호에 여러 개의 조건을 적는 것보다 나눠서 적는 것이 편할 수 있습니다. - 글로만 이해하는 것은 어려우니 코드로 확인해볼까요? -- 우선 아래와 같이 데이터를 불러와보겠습니다. -- 조회 성능을 확인하기 위해 데이터 규모를 좀 늘려서 진행합니다. import pandas as pd from tqdm import tqdm def modifier(x) : return str(int(x) // 10 * 10) + "+ years" df = pd.read_csv('/content/sample_data/california_housing_train.csv') df['housing_period'] = df['housing_median_age'].apply(modifier) df['period_grade'] = df['housing_period'].map(lambda x : "good" if int(x[:-7]) 20 else ("normal" if int(x[:-7]) 40 else "bad")) for _ in tqdm(range(5)) : df = pd.concat([df, df], ignore_index=True) df.info() df -- 이후 중복 조건문을 통해 housing_median_age가 10과 30 사이에 있는 'total_bedrooms' 칼럼만을 조회해보도록 하겠습니다. df1 = df[(df.housing_median_age > 10) & (df.housing_median_age 30)]['total_bedrooms'] df1 위 코드의 결과와 아래 코드의 결과는 완전히 동일합니다. df1 = df['total_bedrooms'][(df.housing_median_age > 10) & (df.housing_median_age 30)] df1 -- colab이나 jupyter notebook 과 같은 작업 환경에서 지원되는 magic function 중 하나인 %%timeit을 이용해 작동 시간을 동시에 체크해보겠습니다. 1) 행 조건문 적용 후 열 조회 %%timeit -n 5 -r 5 df1 = df[(df.housing_median_age > 10) & (df.housing_median_age 30)]['total_bedrooms'] df1 (사진) 2) 열 적용 후 행 조건문 조회 %%timeit -n 5 -r 5 df1 = df['total_bedrooms'][(df.housing_median_age > 10) & (df.housing_median_age 30)] df1 (사진) 아래의 방법이 더 빠른 결과를 내게 됩니다! 사실 파이썬의 판다스 데이터 프레임의 경우, 행열을 조회하는 과정에서 많은 부분을 캐시화해 사용하기에 두 기능의 차이는 크지 않습니다. (오히려 일정 이상 데이터 사이즈가 커지면 우열 관계가 없어지거나 역전되기도 합니다) 이러한 이유로 저 두 방법의 성능차이를 굳이 고려하실 필요는 없지만, 추후 Time Series Data와 같이 어마어마한 양의 데이터를 다루게 되신다면 그때는 위와 같이 Column 중심의 데이터 우선 선택이 중요해질 수 있습니다. -- 마지막으로 위에서 언급한 바와 같이 괄호와 &를 이용해 하나의 대괄호 안에 여러 개의 조건문을 사용했을 때와 사용하지 않았을 때를 비교해보고 마치겠습니다. 1) 행 조건문을 통해 선조회 후 해당 칼럼 조회 %%timeit -n 5 -r 5 df2 = df[(df.housing_median_age > 10)][(df.housing_median_age 30)]['total_bedrooms'] df2 (사진) 2) 열 조회 후 열 조건으로 조회 %%timeit -n 5 -r 5 df2 = df['total_bedrooms'][(df.housing_median_age > 10)][(df.housing_median_age 30)] df2 (사진) 오히려 이 경우엔 하나의 대괄호 안에 중복으로 적용한 것보다 유의미한 속도차이가 나게 됩니다. [ 정 리 ] 1. 판다스 데이터 프레임의 슬라이싱 및 조회의 순서 차이에 대한 성능 차이는 거의 없다. 있어도 유의미하지 않으며, 절대적이지도 않다. 2. 여러 조건문을 적용할 때에는 여러 개로 나눠쓰는 것과 한 번에 쓰는 것의 결과물 차이는 없지만, 성능 차이는 나게 된다. 3. 다만 위의 두 경우 모두 빅분기 시험 목적으로는 고려하지 않아도 충분하며, 현업 단계에서는 spark를 통한 대규모 데이터 처리, streaming 데이터와 같은 상황이라면 고려해볼만 하다. 위에서 사용한 코드가 저장된 COLAB notebook을 공유드립니다. 아래 바로가기를 클릭해서 본인의 드라이브로 복사본을 만든 뒤 몇 번 해보시면 금방 익숙해지실 겁니다~ 바로가기 정연님뿐 아니라 다른 수강생분들에게도 도움될 수 있는 질문 감사드리며, 이해안되는 게 있거나 추가로 궁금한게 생기면 언제든 질문주시면 감사하겠습니다.
- 0
- 1
- 187