機械を使って勉強して部屋の値段を予測する。


プロジェクト紹介
背景:
DC競技種目は回帰モデルを使って住宅価格の予測を行います。
データ紹介:
データは主に2014年5月から2015年5月までの米キングコンuntyの住宅販売価格と住宅の基本情報を含む。
トレーニングデータは主に10000個のレコード、14個のフィールドを含みます。それぞれは以下の通りです。
  • 販売日(date):2014年5月から2015年5月までの住宅販売時の日付。
  • 販売価格(price):不動産取引価格、単位はドルで、目標予測値です。
  • 寝室数num):部屋の中の寝室の数;
  • 浴室数(bathroom u)num):家の中の浴室の数;
  • 住宅面積ara):家の生活面積;
  • 駐車面積space):駐車場の面積;
  • 階層数num):家屋の階数;
  • 家屋の評価(house u)score):King County家屋採点システムの家屋に対する全体の評価;
  • 建築面積地下室以外の建物の面積。
  • 地下室面積地下室の面積。
  • 建築年(yearbuilt):建物ができた年。
  • 修復年(yearremodadd):家屋の前回修復の年;
  • 緯度(lat):家屋の緯度。
  • 経度(long):家屋の位置の経度。
  • ターゲット:
    アルゴリズムは,平均予測誤差を計算することにより,回帰モデルの優劣を測定した。平均予測誤差が小さいほど,回帰モデルが良いことを示した。
    コードの詳細
    データのインポート
    まず分析に必要なpythonパッケージを導入します。
    
    #          
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    %matplotlib inline
    ダウンロードしたkc_をインポートします。trainのcsvファイル:
    
    #    
    train_names = ["date",
                   "price",
                   "bedroom_num",
                   "bathroom_num",
                   "house_area",
                   "park_space",
                   "floor_num",
                   "house_score",
                   "covered_area",
                   "basement_area",
                   "yearbuilt",
                   "yearremodadd",
                   "lat",
                   "long"]
    data = pd.read_csv("kc_train.csv",names=train_names)
    data.head()
    在这里插入图片描述
    データ前処理
    データセットの概要を表示
    
    #        
    data.info()
    在这里插入图片描述
    図からは欠損値がないことが分かりますので、欠損値を処理する必要はありません。
    データの分割:
    生データの年月日を分解して、家屋の建築年と修復年によって、販売してから何年が経ったかを計算してみると、17の特徴があります。
    
    sell_year,sell_month,sell_day=[],[],[]
    house_old,fix_old=[],[]
    for [date,yearbuilt,yearremodadd] in data[['date','yearbuilt','yearremodadd']].values:
        year,month,day=date//10000,date%10000//100,date%100
        sell_year.append(year)
        sell_month.append(month)
        sell_day.append(day)
        house_old.append(year-yearbuilt)
        if yearremodadd==0:
            fix_old.append(0)
        else:
            fix_old.append(year-yearremodadd)
    del data['date']
    data['sell_year']=pd.DataFrame({'sell_year':sell_year})
    data['sell_month']=pd.DataFrame({'sell_month':sell_month})
    data['sell_day']=pd.DataFrame({'sell_day':sell_day})
    data['house_old']=pd.DataFrame({'house_old':house_old})
    data['fix_old']=pd.DataFrame({'fix_old':fix_old})
    data.head()
    
    在这里插入图片描述
    イン変数データの状況を観察する
    
    #    
    print(data['price'].describe())
    在这里插入图片描述
    
    #  price     
    plt.figure(figsize = (10,5))
    # plt.xlabel('price')
    sns.distplot(data['price'])
    在这里插入图片描述
    データと画像からは、priceは典型的な右偏り分布を示しているが、全体的には一般的な法則に合致していることがわかる。
    相関分析
    引数と変数の相関を分析し、相関行列の熱力図を描き、各変数の相関を比較します。
    
    #             
    plt.figure(figsize = (20,10))
    internal_chars = ['price','bedroom_num','bathroom_num','house_area','park_space','floor_num','house_score','covered_area'
                      ,'basement_area','yearbuilt','yearremodadd','lat','long','sell_year','sell_month','sell_day',
                     'house_old','fix_old']
    corrmat = data[internal_chars].corr()  #       
    sns.heatmap(corrmat, square=False, linewidths=.5, annot=True) #   
    csdn.net/jlf7026/article/details/84630414
    在这里插入图片描述
    相関が大きいほど、色が薄いです。よく見えないかもしれませんので、ランキングを見てみます。
    
    #         
    print(corrmat["price"].sort_values(ascending=False))
    在这里插入图片描述
    ハウスが見えるシェアハウスscore,covered_ara,bathroomnumのこの4つの特徴はpriceに対する影響が最も大きく、全部0.5を超えました。負の数はpriceと負の相関があることを示している。
    特徴の選択
    一般的には、変数(price)との相関が大きいものを選んで特徴を作ってみましたが、ベストテンの特徴を選んでモデリング予測をしてみましたが、結果はあまり良くないので、既存の特徴を全部使っています。
    正規化
    各特徴のデータ範囲が異なり、線形回帰の効果が影響しますので、データを正規化します。
    
    #    
    data = data.astype('float')
    x = data.drop('price',axis=1)
    y = data['price']
    from sklearn.preprocessing import MinMaxScaler
    scaler = MinMaxScaler()
    newX= scaler.fit_transform(x)
    newX = pd.DataFrame(newX, columns=x.columns)
    newX.head()
    
    在这里插入图片描述
    データセットを区分する
    
    #              
    from sklearn.model_selection import train_test_split
    X_train,X_test,y_train,y_test = train_test_split(newX, y, test_size=0.2, random_state=21)
    
    モデルを作る
    二つのモデルを予測するために選択して、そのモデルを観察したほうがいい。
  • リニア回帰
  • ランダム森林
  • 
    #    
    from sklearn import metrics
    def RF(X_train, X_test, y_train, y_test):    #     
        from sklearn.ensemble import RandomForestRegressor
        model= RandomForestRegressor(n_estimators=200,max_features=None)
        model.fit(X_train, y_train)
        predicted= model.predict(X_test)
        mse = metrics.mean_squared_error(y_test,predicted)
        return (mse/10000)
    def LR(X_train, X_test, y_train, y_test):    #    
        from sklearn.linear_model import LinearRegression            
        LR = LinearRegression()
        LR.fit(X_train, y_train)
        predicted = LR.predict(X_test)
        mse = metrics.mean_squared_error(y_test,predicted)
        return (mse/10000)
    評価基準
    アルゴリズムは,平均予測誤差を計算することにより,回帰モデルの優劣を測定した。平均予測誤差が小さいほど,回帰モデルが良いことを示した。
    
    print('RF mse: ',RF(X_train, X_test, y_train, y_test))
    print('LR mse: ',LR(X_train, X_test, y_train, y_test))
    在这里插入图片描述
    ランダム森林アルゴリズムは線形回帰アルゴリズムよりかなり良いことが分かった。
    締め括りをつける
    機械の勉強について初歩的な理解ができた。しかし,データの前処理,およびパラメータ,特徴,モデルの調整はまだ不十分である。
    今後の勉強を通じて、どんどん上達していきたいです。この文章を読んでいる友達と一緒に機械学習の魅力を感じてほしいです。もっと多くの関連機械学習の内容は私達の以前の文章を検索してください。あるいは次の関連記事を引き続き閲覧してください。これからもよろしくお願いします。