본문 바로가기

전체 글

(602)
Kaggle에 submit 하기 Kaggle은 각 문제마다 train 데이터셋과 test 데이터셋, sample_submission 데이터셋을 제공한다. 우리가 머신러닝 모델을 만들었다면 최종적으로 test 데이터셋의 예측값들을 Kaggle에게 알려주어야 한다. 이 과정은 보통 submission.csv 파일을 만들어서 Kaggle에 업로드하면 간단히 끝낼 수 있다. 우선 제출할 데이터가 아래와 같이 있다고 하자. print(submission_data.head()) print(submission_data.describe()) submission_data.info() Pandas DataFrame 인 submission_data 변수로부터 submission.csv 파일을 만들어야 한다. 이 파일은 아래 코드로 간단히 생성할 수 있다...
Scikit-learn HardVoting, SoftVoting 사용법 머신러닝 전략 중에서 성능을 높이기 위해 사용하는 방법 중 하나는 다수결의 원칙을 따르는 것이다. 1과 0중 하나를 예측해야 할 때 모델 A는 1, 모델 B는 0, 모델 C는 1을 예측했다면 다수결에 따라 최종 예측을 1로 한다. 이를 Hard Voting 이라 한다. 각 모델은 1과 0을 예측할 때 Hard Voting 처럼 둘 중 하나만 지정할 수도 있고, 0.8의 확률로 1이 예측되고 0.2의 확률로 0이 예측된다고 말할수도 있다. 만약 모델 A가 1을 0.8, 0을 0.2의 확률로 예측하고 모델 B가 1을 0.7, 0을 0.3의 확률로 예측하고 모델 C가 1을 0.2, 0을 0.8의 확률로 예측했다면 1의 최종 예측 확률은 (0.8 + 0.7 + 0.2) / 3 = 0.57, 0의 최종 예측 확률..
모델 학습 시간과 성능은 비례하지 않는다 머신러닝 문제를 풀다가 모델의 학습 시간이 길다고 해서 성능이 좋은 건 아니라는 사실을 알게 되었다. 아래 코드를 통해서 여러 머신러닝 모델의 학습 시간을 측정하였다. # 리스트 준비 models = [ran, knn, log, xgb, gbc, svc, ext, ada, gnb, gpc, bag] model_names = ['Random Forest', 'K Nearest Neighbour', 'Logistic Regression', 'XGBoost', 'Gradient Boosting', 'SVC', 'Extra Trees', 'AdaBoost', 'Gaussian Naive Bayes', 'Gaussian Process', 'Bagging Classifier'] scores = {} # 모델 튜닝 ..
연속적인 DataFrame의 값들을 몇 개의 그룹으로 나누고 싶을 때 머신러닝 공부를 하다가 0~1의 연속적인 값을 가지는 데이터를 10개의 그룹으로 나누고 싶어졌다. 아래 데이터는 기존의 데이터이다. normalized_train.head() 각 column의 데이터들이 0~1 사이의 연속적인 값들을 가지고 있다. 내가 하고 싶은 것은 0.0 = 0.3) & (normalized_train[column_name] = 0.4) & (normalized_train[column_name] = 0.5) & ..
3. DataFrame의 column별 데이터의 분포가 보고 싶을 땐 seaborn.displot() 각 컬럼별로 어느 구간에 데이터가 몰려있는지 알고 싶다면 seaborn의 displot을 사용해보자. import random import seaborn as sns rand_data = [] for _ in range(1, 10000): # 10000개의 난수 생성 rand_data.insert(0, random.randrange(0, 10001)) # 생성된 난수는 0~10000 사이의 값을 가짐 sns.displot(data = rand_data, kind='kde').set(title='Random Values') 위의 예제는 0~10000개의 난수를 생성하여 rand_data 배열에 넣고 이 난수들의 분포를 seaborn을 통해 시각화하는 코드이다. 참고로, 각 난수는 0~10000 사이의 값을..
Numpy 차원 낮추기 - ravel() vs reshape() vs flatten() Machine Learning을 공부하다 보면 배열의 차원을 낮추는 경우가 종종 발생한다. 예를 들어 아래와 같이 2차원 배열인 array_2d가 있다고 할 때, 차원을 하나 낮춘다는 의미는 2차원 배열이 1차원 배열이 되는 것이다. 그런데..!! 차원을 낮출 땐 주의사항이 있다. 바로 array_2d의 데이터 변화가 array_1d에 영향을 미치느냐 하는 것이다. 결론부터 말하면, 아래처럼 array_2d의 첫번째 원소값을 바꿀 경우 ravel(), reshape() 으로 차원을 낮춘 array_1d_ravel 과 array_1d_reshape 의 데이터는 바뀌고, flatten()으로 차원을 낮춘 array_1d_flatten은 데이터가 바뀌지 않는다. 잘 모르고 사용하다가 예상치 못하게 변하면 안될..
iterator 쓸 때 주의 사항 (feat. Cannot dereference end list iterator) c++ 에서 map의 iterator를 사용하다가 'Cannot dereference end list iterator' 오류를 맞닥뜨렸다. 코드만 보았을 때에는 괜찮아 보였는데,, 원인은 map의 find() 함수 리턴값이 iterator 였다는 점에서 시작한다. find() 함수는 map 내에서 찾고자 하는 값이 없을 경우 map::end() 를 리턴하는데, 이 end()에 접근해서 데이터를 읽으려고 하면 에러가 발생하기 때문이다. 아래 코드의 1번 시나리오처럼 map에 있는 값에 접근하면 iter->second 에도 정상적으로 접근하여 값을 얻어온다. iter가 map의 end()를 가리키지 않기 때문이다. 반면, 2번 시나리오처럼 map에 없는 값에 접근하면 iter는 map내에 찾는 데이터가 없다..
2. EDA에 도움되는 파이썬 Pandas 함수들 EDA 과정에서 도움이 되는 기본적인 Pandas 함수들을 titanic 데이터를 활용하여 알아보자. 우선, 아래는 예제 데이터이다. 위 데이터를 가지고 Pandas 함수를 사용해보자..! 1. shape 데이터의 행과 열을 (행, 열) 형식으로 표시해준다. titanic_train.shape 2. dtypes 데이터의 각 컬럼별 자료형을 알려준다. titanic_train.dtypes 3. columns 데이터의 컬럼들을 알려준다. titanic_train.columns 4. head & tail 데이터의 일부 row를 앞에서부터 보고 싶을 경우 head 함수를, 뒤에서부터 보고 싶을 경우 tail 함수를 사용한다. 기본 갯수는 5개이며 직접 지정 가능하다. titanic_train.head() tit..