[TIL] day39


#TIL
#実習

PySparkで台北市の住宅価格を予測する


データセットの説明
今回の問題は、台湾台北市新壇地区で収集された住宅取引に関する情報に基づき、住宅価格を予測する回帰モデルを構築することである.訓練データには6つの特徴と家屋の坪当たりの価格に相当するラベル情報が提供されている.ラベルでは、住宅の最終価格ではなく、坪当たりの価格だと改めて強調した.
各カラムの説明は、すべてのフィールドが実数タイプであるが、X 4を除く.
X 1:不注意で住宅取引日を提供します.小数点は月を表す.例えば、2013.250は2013年3月(0.250=3/12)を表す
X 2:住宅年齢(年数)
X 3:最寄りの地下鉄駅(メートル)
X 4:自宅近くのコンビニ数
X 5:家屋位置の緯度
X 6:家屋位置の経度(経度)
Y:住宅の平均価格
データを読み込み中!
data = spark.read.csv('./Taipei_sindan_housing.csv', header=True, inferSchema=True)
data.printSchema()

[out]
root
 |-- X1: double (nullable = true)
 |-- X2: double (nullable = true)
 |-- X3: double (nullable = true)
 |-- X4: integer (nullable = true)
 |-- X5: double (nullable = true)
 |-- X6: double (nullable = true)
 |-- Y: double (nullable = true)
data.show()でデータを確認します.describeに特別な点があるかどうかを確認します.

データをクリア...?


データのクリーンアップを試みるには、次の4つの点を考慮する必要があります.
  • 分類データ
  • 不要なデータ
  • outlier
  • nul
  • だけど!
    分類データがなく、必要なデータもなく、群外値も見えないので、null値のみチェックしました.
    しかし、他のメンバーたちがやっていることから、データの前処理で他の機能を作ったのは、私も...知っていたのにやってしまった.
    # null count
    def countNull(df,var):
      return df.where(df[var].isNull()).count()
    
    missing = {c: countNull(data,c) for c in ['X1','X2','X3','X4','X5','X6']}
    
    print(missing)
    まずnull値の個数を数えましょう!
    [out]
    {'X1': 0, 'X2': 0, 'X3': 0, 'X4': 0, 'X5': 0, 'X6': 0}

    フィーチャーベクトルの作成

    VectorAssemblerを使用して新しいフィーチャー値を作成し、横に貼り付けます.feature_columns['X1', 'X2', 'X3', 'X4', 'X5', 'X6']です
    あとtransform
    from pyspark.ml.feature import VectorAssembler
    
    feature_columns = data.columns[:-1]
    assembler = VectorAssembler(inputCols=feature_columns, outputCol="features")
    data_2 = assembler.transform(data)
    その後、トレーニングデータとテストデータを分離します(7:3)
    (料理してるみたい)
    train, test = data_2.randomSplit([0.7, 0.3])

    モデルの作成


    LinearRegressionを使用します
    from pyspark.ml.regression import LinearRegression
    
    algo = LinearRegression(featuresCol="features", labelCol="Y")
    model = algo.fit(train)

    モデルのパフォーマンスの測定


    (元の予測値も出力しましたが、パフォーマンス測定に直接移動します.)
    evaluation_summary = model.evaluate(test)
    evaluation_summary.meanAbsoluteError
    [out]
    6.6091972821462015
    推定値と実際の値の差は約6.61です.
    f"RMSE: {evaluation_summary.rootMeanSquaredError:.3f}"
    [out]
    RMSE: 8.948
    f"r2: {evaluation_summary.r2:.3f}"
    [out]
    r2: 0.555
    RMSE: 9.948
    r2: 0.555
    出てきましたが、これが出てくるかどうかわからないので、他のメンバーの結果と比較してみると、いったん50%を超えると、半分くらい歩いてしまいました…!
    一番鏡に映った人は62?63? この程度なら前倒し放送と言えると思います実は私は何も触っていないので、データのあるものをそのまま使っただけなので、データがいいかららしいのですが、ほほほ
    他のデータを使用する場合、より多くの前処理または通常化が必要になる場合があります.
    △タイタニック号でやってみるのもいいですね.