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

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

相关推荐
Java Fans13 小时前
梯度提升树(Gradient Boosting Trees)详解
机器学习·集成学习·boosting
学不会lostfound6 天前
一、机器学习算法与实践_07支持向量机与集成学习算法笔记
随机森林·机器学习·支持向量机·集成学习·xgboost·lightgbm
正义的彬彬侠8 天前
CatBoost 中对分类特征进行目标变量统计编码 公式解析
人工智能·机器学习·集成学习·boosting·catboost
_清豆°12 天前
机器学习(七)——集成学习(个体与集成、Boosting、Bagging、随机森林RF、结合策略、多样性增强、多样性度量、Python源码)
人工智能·随机森林·机器学习·adaboost·集成学习·boosting·bagging
正义的彬彬侠13 天前
XGBoost算法Python代码实现
python·决策树·机器学习·numpy·集成学习·boosting·xgboost
正义的彬彬侠15 天前
《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析
人工智能·决策树·机器学习·集成学习·boosting·xgboost
正义的彬彬侠19 天前
在AdaBoost中,分类错误的样本的权重会增大
人工智能·机器学习·adaboost·集成学习·boosting·自适应提升算法
正义的彬彬侠19 天前
在AdaBoost中每轮训练后,为什么错误分类的样本权重会增大e^2αt倍
人工智能·机器学习·adaboost·集成学习·boosting·自适应提升算法
Dontla20 天前
Kaggle入门指南(Kaggle竞赛)
kaggle
bingHHB1 个月前
小满OKKICRM与钉钉数据集成方案解析
服务器·数据库·集成测试·钉钉·集成学习