1月18日

6438 ワード

今日は限界挑戦試合に参加しましたが、
ちっともわからない.
私から見れば、すべてのデータを手に入れた後、
そんな仕事らしい・・・まず点数を取らなければなりませんが、提出されていません.
lmsの説明は私の画面とは違って、どこから入手すればいいか分かりません.
まず私が知っている部分は.
import warnings
warnings.filterwarnings("ignore")

import os
from os.path import join

import pandas as pd
import numpy as np

import missingno as msno

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import KFold, cross_val_score
import xgboost as xgb
import lightgbm as lgb

import matplotlib.pyplot as plt
import seaborn as sns
コードを先に実行したい場合は、実行するライブラリを手に入れなければなりません.
また、データファイルは正しいファイルパスを使用する必要があります.
data_dir = os.getenv('HOME')+'/aiffel/kaggle_kakr_housing/data'

train_data_path = join(data_dir, 'train.csv')
sub_data_path = join(data_dir, 'test.csv')      # 테스트, 즉 submission 시 사용할 데이터 경로

print(train_data_path)
print(sub_data_path)
ここにはたくさんの情報があります.

もしこれらのデータがすべてロードされたら、何個ありますか?>
data = pd.read_csv(train_data_path)
sub = pd.read_csv(sub_data_path)
print('train data dim : {}'.format(data.shape))
print('sub data dim : {}'.format(sub.shape))
結果:train datadim:(15035,21)subdatadim:(6468,20)
ぶるぶる震える学習データは15000個、テストデータは6400個です.
しかし、なぜ学習データは21コラム、テストは20コラムなのか.価格コラムの欠如が原因だ.
だからその価格コラムを削除したいなら
y = data['price']
del data['price']

print(data.columns)
このようにコードを作成し、結果を表示します.
Index(['id', 'date', 'bedrooms', 'bathrooms', 'sqft_living', 'sqft_lot',
'floors', 'waterfront', 'view', 'condition', 'grade', 'sqft_above',
'sqft_basement', 'yr_built', 'yr_renovated', 'zipcode', 'lat', 'long',
'sqft_living15', 'sqft_lot15'],
dtype='object')
こつこつと値段がない
しかし、このモデルを学ぶ前に、すべてのデータを知りたいです.
そうするには、学習とテストデータを統合しなければなりません.
train_len = len(data)
data = pd.concat((data, sub), axis=0)

print(len(data))
結果:21503(データ集計が表示されます)
チケットで見たいなら~
 data.head()
 

次のデータでは、空白データとデータ全体の分布を決定する前処理プロセスが必要です.
さっきインストールしたmissingnoライブラリを使いましょう
msno.matrix(data)

こんな結果になった.
次にidを使用してデータフレームインデックスを適用します.
第3段階に進む.
1.まずid欄が欠落値であるかを確認する
2.次の測定値のデータのみ抽出します.
3.最後に実測値データ個数を算出する.
まずidコラムが欠落しているかどうかを確認します.
null_check = pd.isnull(data['id'])
print(null_check)

そして実測値データを取り出します.
null_data = data.loc[null_check, 'id']
null_data.head()
Series([], Name: id, dtype: int64)
測定値がないので空いていますか?
最後に、もし私が実測データの数を数えたら?
print('{}: {}'.format('id', len(null_data.values)))
id: 0
ないので0を表示...
でもこれは別々にすると面倒なので一度に済ませましょう
 print('{} : {}'.format('id', len(data.loc[pd.isnull(data['id']), 'id'].values)))
id: 0
でもこれはIDだけじゃなくて上にも見たように別の場所で使われるのでfor文にしましょう
for c in data.columns:
    print('{} : {}'.format(c, len(data.loc[pd.isnull(data[c]), c].values)))
ただしidに不要なものがあるとは限らないので削除しましょうが、後で予測結果を提出するためにidをsub id変数に入れます.
sub_id = data['id'][train_len:]
del data['id']

print(data.columns)
ここでdateコラムはapply関数で、必要な部分だけを切り取ります!
data['date'] = data['date'].apply(lambda x : str(x[:6]))
data.head()
しかしstr(x[:6])はなぜこれを使うのか...
結果を導き出せば先ほど上の表を見ると20141013 T 0000はこのように長くなります
不便そうだったので年/月だけ表記しました.
だから出力から見ると201410までで、効果はとてもきれいです.
まずそれをきれいにして、不要なものを片付けてから、データ全体の分布をチェックします.
だから私はグラフを使って、離散データに対して、柔らかい曲線で分布全体の視覚関数snsを決定することもできます.kdeplotを使用するべきです.
fig, ax = plt.subplots(9, 2, figsize=(12, 50))   # 가로스크롤 때문에 그래프 확인이 불편하다면 figsize의 x값을 조절해 보세요. 

id 변수(count==0인 경우)는 제외하고 분포를 확인합니다.
count = 1
columns = data.columns
for row in range(9):
    for col in range(2):
        sns.kdeplot(data=data[columns[count]], ax=ax[row][col])
        ax[row][col].set_title(columns[count], fontsize=15)
        count += 1
        if count == 19 :
           break
この命令を置いて、結果を見てください.

このようなグラフは19個ほどあります.
しかし、グラフをよく見ると、寝室、sqft living、sqft lot、sqft over、sqft base、sqft living 15、sqft lot 15変数は片側に偏っている傾向にあることが分かった.
このような偏り側の分布では,ログ変換(log−scaling)によりデータ分布を正規分布に近づけることができる.
以下の傾斜した列をbest columnsリストに含め、すべてnpです.log 1 p()を用いてログ変換を行う.numpy.log 1 p()関数は、入力配列内の各要素の自然ログ(1+x)を返します.
skew_columns = ['bedrooms', 'sqft_living', 'sqft_lot', 'sqft_above', 'sqft_basement', 'sqft_lot15', 'sqft_living15']

for c in skew_columns:
    data[c] = np.log1p(data[c].values)

print('얍💢')
このように変換してグラフィックを出力すると?
fig, ax = plt.subplots(4, 2, figsize=(12, 24))

count = 0
for row in range(4):
    for col in range(2):
        if count == 7:
            break
        sns.kdeplot(data=data[skew_columns[count]], ax=ax[row][col])
        ax[row][col].set_title(skew_columns[count], fontsize=15)
        count += 1
        

真ん中に偏りが集中する.
しかし、ログ変換を分散偏向を減らすにはどうすればいいのでしょうか.
それを見るには、まずグラフを描かなければなりません.
xx = np.linspace(0, 10, 500)
yy = np.log(xx)

plt.hlines(0, 0, 10)
plt.vlines(0, -5, 5)
plt.plot(xx, yy, c='r')
plt.show()

では、ログ関数の特徴を示すグラフが表示されます.
0したがって、入力が0に近い値がxxであれば、その関数値yyは非常に広い範囲に展開される.
log関数は,0に近い値を密集して集約した入力値をより広い範囲に広げるという特徴がある.
逆にxx値が徐々に大きくなるにつれてlog関数の傾きは急激に小さくなる.
これは、大きなxx値に対してyy値に大きな差がないため、広い範囲のxxを小さいyy値区間に集約する特徴があることを意味する.
今日はここまでにして、今度続けて書きましょう.