이번 포스팅에서는 준비한 데이터를 모델에 넣어 예측해보자
scikit learn 을 import 하고 scaling 을 해준다.
scaling 은 "스케일링은 자료 집합에 적용되는 전처리 과정으로 모든 자료에 선형 변환을 적용하여 전체 자료의 분포를 평균 0, 분산 1이 되도록 만드는 과정" 이라고 한다.
fit_transform 메서드를 이용해서 train_non_cat 와 test_non_cat 을 변환시켜준다
1 2 3 4 | from sklearn.preprocessing import StandardScaler std = StandardScaler() train_non_cat_scaled = pd.DataFrame(std.fit_transform(train_non_cat),columns=train_non_cat.columns) test_non_cat_scaled = pd.DataFrame(std.fit_transform(test_non_cat),columns=test_non_cat.columns) | cs |
위 코드를 이용하면,
이랬던 데이터가
teacher_number_of_previously_posted_projects | quantity | price | Project_submitted_month | Project_submitted_year | ||
---|---|---|---|---|---|---|
0 | 26 | 6 | 299.98 | 11 | 2016 | |
1 | 1 | 20 | 20.00 | 4 | 2017 | |
2 | 5 | 1 | 469.99 | 1 | 2017 | |
3 | 16 | 5 | 684.47 | 8 | 2016 | |
4 | 42 | 2 | 355.50 | 8 | 2016 |
이렇게 변환되게 된다.
teacher_number_of_previously_posted_projects | quantity | price | Project_submitted_month | Project_submitted_year | ||
---|---|---|---|---|---|---|
0 | 0.526947 | -0.418089 | 0.006132 | 1.259031 | -0.620422 | |
1 | -0.365400 | 0.115409 | -0.757345 | -0.862390 | 1.611807 | |
2 | -0.222625 | -0.608624 | 0.469732 | -1.771570 | 1.611807 | |
3 | 0.170008 | -0.456196 | 1.054597 | 0.349851 | -0.620422 | |
4 | 1.098049 | -0.570517 | 0.157529 | 0.349851 | -0.620422 |
아래 코드로 표준편차를 구해보면
1 | train_non_cat_scaled['teacher_number_of_previously_posted_projects'].std() | cs |
1.0000027460573966 으로, 1에 매우 근접한 값이 나온다.
아래 코드는 TfidVectorizer 를 이용하여 지난번 만든 text_columns의 가중치를 구하는 코드이다.
TF-IDF(Term Frequency - Inverse Document Frequency)는 정보 검색과 텍스트 마이닝에서 이용하는 가중치로, 여러 문서로 이루어진 문서군이 있을 때 어떤 단어가 특정 문서 내에서 얼마나 중요한 것인지를 나타내는 통계적 수치이다. 문서의 핵심어를 추출하거나, 검색 엔진에서 검색 결과의 순위를 결정하거나, 문서들 사이의 비슷한 정도를 구하는 등의 용도로 사용할 수 있다. 참고: text_columns = ["project_title","project_resource_summary","projectessay_1_3","projectessay_2_4"] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from sklearn.feature_extraction.text import TfidfVectorizer from scipy.sparse import hstack, csr_matrix word_vectorizer = TfidfVectorizer( sublinear_tf=True, lowercase=True, strip_accents='unicode', analyzer='word', token_pattern=r'\w{1,}', stop_words='english', ngram_range=(1, 1), max_features=10000) #Vectorize text columns vectorized_columns = [] vectorized_columns_test = [] for text_column in text_columns: word_vectorizer.fit(pd.concat([train_text[text_column],test_text[text_column]])) vectorized_columns.append(word_vectorizer.transform(train_text[text_column])) vectorized_columns_test.append(word_vectorizer.transform(test_text[text_column])) train_features = hstack(vectorized_columns+[csr_matrix(train_non_cat_scaled)]+[csr_matrix(train_cat)], 'csr') test_features = hstack(vectorized_columns_test+[csr_matrix(test_non_cat_scaled)]+[csr_matrix(test_cat)], 'csr') | cs |
위에서, 맨 아래 두 줄의 코드로 non_cat_scaled 와 cat, vectorized_columns 데이터를 다 취합한다.
아래 코드는 데이터를 모델에 넣고 피팅 시키는 과정이다.
지난번 포스팅에서 y에 train 데이터의 project_is_approved column을 넣은 것을 기억하자
(y = train_joined['project_is_approved'])
id 에 test 데이터의 id 를 넣고, submission['project_is_approved'] 에는 test_feature 를 이용해 모델링한 값을 넣어준다.
LogisticRegression 모델을 이용하였다.
마지막으로 submission.csv 파일로 변환하여 저장 후에 제출하면 끝.
1 2 3 4 5 6 7 8 | from sklearn.linear_model import LogisticRegression model = LogisticRegression(n_jobs=-1) model.fit(train_features,y) predicted_proba = model.predict_proba(test_features) submission = pd.DataFrame.from_dict({'id': test['id']}) submission['project_is_approved'] = predicted_proba[:,1] submission.to_csv("submission.csv",index=False) | cs |
같은 문제를 가지고 할지, 다른 문제를 가져올지 모르겠지만
다음 포스팅에서는 LogisticRegression 뿐만 아니라 다른 모델을 이용하여
예측의 정확도를 높이는 방법을 알아보고자 한다.