kaggle:房价预测

比赛链接

结果展示

结果链接

8848是密码

文章目录

数据处理

python 复制代码
#打开文件
import pandas as pd
dataset1=pd.read_csv("train.csv")
dataset2=pd.read_csv("test.csv")
python 复制代码
#按列处理,其中包括缺失值的填充,独热编码,放缩
import numpy as np
def function1(dataset):
    dataset['MSSubClass']=dataset['MSSubClass'].astype(str)
    data=dataset["Id"]
    for i in dataset.columns[1:]:
        try:
            sum(dataset[i])
            data_temp=dataset[i]
            data_temp.fillna(data_temp.dropna().mean(),inplace=True)
            data_temp=(data_temp-np.mean(data_temp))/np.std(data_temp)
            data=pd.concat([data,data_temp],axis=1)
        except:
            data_temp=pd.get_dummies(dataset[i])
            data=pd.concat([data,data_temp],axis=1)
    return data.astype(np.float64).to_numpy()[:,1:]
python 复制代码
data_x=function1(pd.concat([dataset1.iloc[:,:-1],dataset2],axis=0))
data_train_x=data_x[:dataset1.shape[0]]
data_test_x=data_x[dataset1.shape[0]:]
python 复制代码
#按行处理,对异常值进行处理
def function2(data):
    data.astype(np.int64)
    lt1=np.mean(data,axis=0)-3*np.std(data,axis=0)
    lt2=np.mean(data,axis=0)+3*np.std(data,axis=0)
    lt=[]
    for _ in data:
        for i in range(len(_)-1):
            if _[i]<lt1[i] or _[i]>lt2[i]:
                lt.append(False)
                break
        else:
            lt.append(True)
    return data[lt]
python 复制代码
data_train=np.hstack((data_train_x,dataset1.iloc[:,-1].astype(np.float64).to_numpy()[:,np.newaxis]))
#data_train=function2(data_train)
data_train_x=data_train[:,:-1]
data_train_y=data_train[:,-1]

调包部分

python 复制代码
lt=[]
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import BaggingRegressor
from sklearn.linear_model import Ridge
ridge=Ridge(15)
for i in range(5,101,5):
    md=BaggingRegressor(n_estimators=i,estimator=ridge,random_state=1)
    lt.append(np.sqrt(np.mean(-(cross_val_score(md,data_train_x,np.log(data_train_y),cv=10,scoring='neg_mean_squared_error')))))
    print(i)
import matplotlib.pyplot as plt
plt.plot([i for i in range(5,101,5)],lt)
plt.show()
python 复制代码
md=BaggingRegressor(n_estimators=75,estimator=ridge,random_state=1).fit(data_train_x,np.log(data_train_y))
result=np.exp(md.predict(data_test_x).flatten())
result=np.vstack((np.array([i for i in range(1461,2920)]).astype(np.int32),result)).T
pd.DataFrame(result.astype(np.int32)).to_csv("result.csv",index=False,header=["Id","SalePrice"])

这些全都不是目的
我想过下基础知识

拒绝掉包

岭回归

理论

损失函数
J ( β ) = ∑ i = 1 n ( y i − β 0 − ∑ j = 1 p β j x i j ) 2 + λ ∑ j = 1 p β j 2 J(\beta)=\sum_{i=1}^n(y_i-\beta_0-\sum^p_{j=1}\beta_jx_{ij})^2+\lambda\sum_{j=1}^p\beta_j^2 J(β)=∑i=1n(yi−β0−∑j=1pβjxij)2+λ∑j=1pβj2
J ( β ) = ( y − X β ) T ( y − X β ) + λ β T β J(\beta)=(\mathbf y-\mathbf X\mathbf \beta )^T(\mathbf y-\mathbf X\mathbf \beta)+\lambda\beta^T\beta J(β)=(y−Xβ)T(y−Xβ)+λβTβ

求偏导数
∂ J ( β ) ∂ β = − 2 X T y + 2 X T X β + 2 λ β \frac{\partial J(\beta)}{\partial\beta}=-2\mathbf X^T\mathbf y+2\mathbf X^T\mathbf X\beta+2\lambda\beta ∂β∂J(β)=−2XTy+2XTXβ+2λβ

令0求解
β = ( X T X + λ I ) − 1 X T y \beta=(\mathbf X^T\mathbf X+\lambda\mathbf I)^{-1}\mathbf X^T\mathbf y β=(XTX+λI)−1XTy

代码

python 复制代码
class Ridge:

    def __init__(self,l):
        self.l=l

    def fit(self,x,y):
        return np.dot(np.dot(np.linalg.inv(np.dot(x.T,x)+self.l*np.identity(x.shape[1])),x.T),y)

实践

还是采用房价预测

数据处理与前一样

python 复制代码
md=Ridge(15)
result=np.dot(data_test_x,md.fit(data_train_x,data_train_y))
result=np.vstack((np.array([i for i in range(1461,2920)]).astype(np.int32),result)).T
pd.DataFrame(result.astype(np.int32)).to_csv("result.csv",index=False,header=["Id","SalePrice"])

结果

自助采样

理论

设原始训练样本集为 D = ( x n , y n ) n = 1 N D={(x_n,y_n)}^N_{n=1} D=(xn,yn)n=1N,从D中重新采样得到一个重采样样本集 D ∗ D^* D∗, D ∗ D^* D∗也由 N N N个样本组成,若采用自助采样从 D D D中重采样获得 D ∗ D^* D∗,则称 D ∗ D^* D∗为一个自助样本集(Bootstrap Samples)。自助采样是指,随机从 D D D中抽取一个样本放入 D ∗ D^* D∗中,同时将该样本放回 D D D中,按照这个方式采样 N N N次,组成自助样本集 D ∗ D^* D∗。

由于是对 D D D做放回采样,采样过程是随机的故可对 D D D重采样 B B B轮,每轮得到 N N N个样本的自助样本集,故可获得 B B B个自主样本集,记为 D ∗ ( b ) , b = 1 , 2 , ⋯   , B D^{*(b)},b=1,2,\cdots,B D∗(b),b=1,2,⋯,B。由于随机放回采样,各自助样本集 D ∗ ( b ) D^{*(b)} D∗(b)不同。

为了理解各自助样本集的不同,我们可以分析 D D D中的任意样本 ( x k , y k ) (x_k,y_k) (xk,yk)被包含在一个自助样本集 D ∗ ( j ) D^{*(j)} D∗(j)中的概率。从D中随机放回采样得到 D ∗ ( j ) D^{*(j)} D∗(j)的过程中,每次采样没有采样到 ( x k , y k ) (x_k,y_k) (xk,yk)的概率为 1 − 1 N 1-\frac{1}{N} 1−N1,独立采样 N N N次均没有被采样到的概率为 ( 1 − 1 N ) N (1-\frac{1}{N})^N (1−N1)N,故样本 ( x k , y k ) (x_k,y_k) (xk,yk)被包含在样本集 D ∗ ( j ) D^{*(j)} D∗(j)中的概率为 1 − ( 1 − 1 N ) N = 1 − e − 1 ≈ 0.632 1-(1-\frac{1}{N})^N=1-e^{-1}\approx0.632 1−(1−N1)N=1−e−1≈0.632,以上假设 N N N充分大。上式说明,在构成自助样本集 D ∗ ( j ) D^{*(j)} D∗(j)式,大约可从 D D D中采集到约 63.2 % 63.2\% 63.2%的样本,即 D D D中约 36.8 % 36.8\% 36.8%的样本没有被采集到 D ∗ ( j ) D^{*(j)} D∗(j)中,从概率上讲,若抛弃重复样本 D ∗ ( j ) D^{*(j)} D∗(j)中只有大约 0.632 N 0.632N 0.632N的有效样本。两个自助样本集 D ∗ ( i ) D^{*(i)} D∗(i)和 D ∗ ( j ) D^{*(j)} D∗(j)内部包含的有效样本是随机的,故 D ∗ ( i ) D^{*(i)} D∗(i)和 D ∗ ( j ) D^{*(j)} D∗(j)相互具有随机性,且具有一定的不相关性。

代码

python 复制代码
from random import randint
def Sampling(data_train_x,data_train_y):
    lt=[randint(0,data_train_x.shape[0]-1) for i in range(data_train_x.shape[0])]
    return data_train_x[lt],data_train_y[lt]

集成学习

前言

自助采样(Bootstrap)是统计学中的一种重采样技术,用于改善统计参数的估计,在集成学习中,可借助自助采样形成多个堆积样本集,在每个重采样的样本基础上训练一个基学习器,然后组合成为一个集成学习器。

Bagging理论

Bagging是Bootstrap Aggregation的简写。Baggin的思想是,首先由训练样本集 D D D,重采样得到 B B B个自助样本集 D ∗ ( b ) , b = 1 , 2 , ⋯ B D^{*(b)},b=1,2,\cdots B D∗(b),b=1,2,⋯B,对于每个 D ∗ ( b ) D^{*(b)} D∗(b),通过基学习算法训练一个基学习器 f ^ ∗ ( b ) ( x ) \hat f^{*(b)}(\mathbf x) f^∗(b)(x),则Bagging集成学习器为 f ^ b a g ( x ) = 1 B ∑ b = 1 B f ^ ∗ ( b ) ( x ) \hat f_{bag}(\mathbf x)=\frac{1}{B}\sum^B_{b=1}\hat f^{*(b)}(\mathbf x) f^bag(x)=B1∑b=1Bf^∗(b)(x)。

Bagging-Ridge代码

python 复制代码
class Bagging:
    
    def __init__(self,n,f):
        self.n=n
        self.f=f

    def fit(self,x,y):
        lt=[]
        for _ in range(self.n):
            data_train_x,data_train_y=Sampling(x,y)
            lt.append(self.f.fit(data_train_x,data_train_y))
        return np.mean(lt,axis=0)

Bagging-Ridge实践

python 复制代码
md=Bagging(75,Ridge(15))
result=np.dot(data_test_x,md.fit(data_train_x,data_train_y))
result=np.vstack((np.array([i for i in range(1461,2920)]).astype(np.int32),result)).T
pd.DataFrame(result.astype(np.int32)).to_csv("result.csv",index=False,header=["Id","SalePrice"])

Bagging-Ridge结果

Tricks

可以采用某种二分算法手动微调。

相关推荐
Mr数据杨15 分钟前
结构化表格分类建模与业务预测落地路径
人工智能·机器学习·分类·数据挖掘·数据分析·kaggle
Mr数据杨2 小时前
Unlearnable CIFAR 10 图像分类实战 从异常训练数据到鲁棒建模
人工智能·机器学习·分类·数据挖掘·数据分析·kaggle
Mr数据杨2 小时前
短文本意图分类助力智能客服自动化服务
机器学习·分类·数据挖掘·数据分析·自动化·kaggle
Mr数据杨2 小时前
医学影像分类实战复盘 从课程赛题到可落地建模流程
人工智能·机器学习·分类·数据挖掘·数据分析·kaggle
Mr数据杨4 小时前
不可学习 ImageNet 二分类实战 从图像识别到训练数据投毒防御
学习·机器学习·分类·数据挖掘·数据分析·kaggle
Mr数据杨5 小时前
医学影像分类模型构建与辅助诊断落地
机器学习·数据分析·kaggle
配奇1 天前
集成学习(Ensemble Learning)
人工智能·机器学习·集成学习
Mr数据杨2 天前
加州房价中位数预测在房地产估值中的应用
机器学习·数据分析·kaggle
Mr数据杨2 天前
面部表情识别在心理健康辅助评估中的应用总结
机器学习·数据分析·kaggle
Mr数据杨2 天前
韩语娱乐新闻评论偏见检测与内容审核优化
机器学习·数据分析·kaggle