とあるcsvを渡されてこれでpriceの推測してね。という課題をみつけたので、やってみる
前処理
まずはデータの中身をみるところから
import pandas as pd df=pd.read_csv("Price.csv") pd.set_option('display.max_columns', 100) df.head(10)
df.columns →出力 Index(['id', 'date', 'price', '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', 'date1'], dtype='object')
ん~よくわからん。
何がpriceに関係しているのかわからん
ということでみんな大好きヒートマップ相関係数をみてみることに
%matplotlib inline df.corr() import seaborn as sns #sns.heatmap(df.corr(), vmax=1, vmin=-1, center=0, annot=True) sns.heatmap(df.corr(), vmax=1, vmin=-1, center=0 )
ん~細かすぎてわからん。idが関係ないのはわかる(当たり前。)
しかしyr_builtとかの相関が0になっているのは全く理解できない。
あとdateが数字じゃないから相関が計算できてない。。
とりあえず、dateの月だけは残してみる。
(家の価格はさすがに月日に相関あるでしょ?、引っ越しシーズンは高くなりそう?)
df_date=[] for i in range(len(df)): df_date.append(int(df["date"][i][4:6])) df["date_int"]=df_date
これでdfをみると新しくdate_intというカラムができた
このまま相関関係みるより、一回正規化したほうが良いのかと思い 正規化してみる
for i in range(len(df_.columns)): s = df_[df_.columns[i]] df_[df_.columns[i]] = (s - s.min()) / (s.max() - s.min())
これで全部のカラムを0~1に変換できる
改めてヒートマップ相関係数を見てみる
%matplotlib inline df_.corr() import seaborn as sns #sns.heatmap(df.corr(), vmax=1, vmin=-1, center=0, annot=True) sns.heatmap(df_.corr(), vmax=1, vmin=-1, center=0 )
えぇ、date関係ないの?そんなことあるの?
まあ仕方ない 関係がありそうなカラムを見ていく
ふ~ん(yr_builtとかzip_codeとか関係ありそうなのに?)
とりあえず0.3以上のやつだけでヒートマップつくる
df_before_2=df[["price","sqft_living","view","sqft_basement","bedrooms","lat","bathrooms","floors","grade","sqft_above","sqft_living15"]] %matplotlib inline df.corr() import seaborn as sns #sns.heatmap(df.corr(), vmax=1, vmin=-1, center=0, annot=True) sns.heatmap(df_before_2.corr(), vmax=1, vmin=-1, center=0,annot=True )
学習
train_df=df_before_2[:15000] test_df = df_before_2[15000:] train_x=train_df[["sqft_living","view","sqft_basement","bedrooms","lat","bathrooms","floors","grade","sqft_above","sqft_living15"]] test_x=test_df[["sqft_living","view","sqft_basement","bedrooms","lat","bathrooms","floors","grade","sqft_above","sqft_living15"]] train_y=train_df["price"] test_y=test_df["price"] import numpy as np from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt lr = LinearRegression(normalize=True) lr.fit(train_x,train_y) pre_y=lr.predict(test_x) import matplotlib.pyplot as plt plt.figure(figsize=(10,6),dpi=100) plt.plot(test_y,c="r") plt.plot(pre_y,c="b") plt.show()
!?!?!??
ん~なんだこれは 学習できているかわからんぞ
次回はもっとちゃんとやってみます