본문 바로가기
머신러닝

Kaggle 풀어보기 - DonorsChoose -3

by 스클루지 2018. 4. 15.
반응형

이번 포스팅에서는 준비한 데이터를 모델에 넣어 예측해보자

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_projectsquantitypriceProject_submitted_month Project_submitted_year
0266299.9811 2016 
112020.004 2017 
251469.991 2017 
3165684.478 2016 
4422355.508 2016

이렇게 변환되게 된다.


teacher_number_of_previously_posted_projectsquantitypriceProject_submitted_month Project_submitted_year
00.526947-0.4180890.0061321.259031 -0.620422 
1-0.3654000.115409-0.757345-0.862390 1.611807 
2-0.222625-0.6086240.469732-1.771570 1.611807 
30.170008-0.4561961.0545970.349851

-0.620422

 
41.098049-0.5705170.1575290.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=(11),
    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 뿐만 아니라 다른 모델을 이용하여

예측의 정확도를 높이는 방법을 알아보고자 한다.

반응형