比赛链接
结果展示
结果链接
8848是密码
文章目录
- 数据处理
- 调包部分
- 拒绝掉包
- 岭回归
- 理论
- 代码
- 实践
- 结果
- 自助采样
- 理论
- 代码
- 集成学习
- 前言
- Bagging理论
- Bagging代码
- Bagging-Ridge实践
- Bagging-Ridge结果
- Tricks
数据处理
#打开文件
import pandas as pd
dataset1=pd.read_csv("train.csv")
dataset2=pd.read_csv("test.csv")
#按列处理,其中包括缺失值的填充,独热编码,放缩
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:]
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]:]
#按行处理,对异常值进行处理
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]
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]
调包部分
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()
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
代码
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)
实践
还是采用房价预测
数据处理与前一样
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)相互具有随机性,且具有一定的不相关性。
代码
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代码
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实践
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
可以采用某种二分算法手动微调。