线性回归分析:
import numpy as np
import random
import pandas as pd
from pandas.plotting import scatter_matrix
from sklearn.linear_model import Ridge,RidgeCV
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt #as就是重新命名的意思
#from matplotlib.font_manager import FontProperties #导入中文字体
from sklearn.linear_model import Lasso,LassoCV
pd_data=pd.read_csv(r"BostonHousing2.csv",header=1)
df1=pd_data[['cmedv']]
df2=pd_data[['crim', 'zn', 'indus',
'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b',
'lstat']]
# #任务一:利用指定的 12 个自变量与因变量 comedy 创建散布图矩阵,主
#要目的查看各自变量与因变量之间的相关性。
print("任务一")
dff=pd_data[['crim', 'zn', 'indus',
'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b',
'lstat','cmedv']]
scatter_matrix(dff)
plt.show()
##任务二:随机地将当前数据集按照 3:1 的容量比例划分为训练集(用于
#建立模型)和测试集(用于检测模型的预测精度),重复此步骤十次,
#并将得到十次结果制作如下的折线图,其中横坐标为次数,纵坐标为
#对应次数的可决系数。如下图所示(可以与图不一致,主要体现可决
#系数变化规律)
print("任务二")
li=[]
for epoch in range(10):
X_train,X_test,Y_train,Y_test = train_test_split(df2,df1,train_size=0.8)
model = Ridge(alpha=0.5,fit_intercept=True)
model = RidgeCV(alphas=[0.1, 1.0, 10.0]) # 通过 RidgeCV 使用交叉验证获取最佳参数值
model.fit(X_train,Y_train)
score=model.score(X_test, Y_test)
li.append(score)
x = list(range(1, 11, 1))
y = [round(i,2) for i in li]
#绘制图片
plt.plot(x,y)
plt.ylim(0, 1) # 限定纵轴的范围
for a, b in zip(x, y):
plt.text(a, b, b)
plt.show()
#任务三 (包含任务5)
#利用岭回归模型随机选取变量进行十折交叉,计算可决系数
print("任务三 (包含任务5)")
print("下面对变量进行随机抽取:")
X_train,X_test,Y_train,Y_test = train_test_split(df2,df1,train_size=0.8)
for p in range(10):
ans=random.randint(1, 12)
df3 = X_train.sample(n=ans,axis=1)
l=list(df3.columns)
df4=pd.DataFrame(X_test,columns=l)
model = Ridge(alpha=0.5)
model = RidgeCV(alphas=[0.01,0.1,0.2, 0.5, 1])
model.fit(df3,Y_train)
ridge_best_alpha = model.alpha_ #得到最佳lambda值
score = model.score(df4,Y_test)
print(f"第{p+1}轮,随机抽取{ans}个变量\n岭回归关键正则参数={ridge_best_alpha},可决系数{round(score,2)}")
#任务四 (包含任务5)
#岭回归、Lasso 回归模型中关键正则参数𝛌的选择:在给定参数𝛌
#的 0.01,0.1,0.2, 0.5, 1 这五个可能性取值的条件下,利用十折交
#叉验证和可决系数确定两个模型的各自最优参数𝛌。
print("任务四 (包含任务5)")
print(f"岭回归回归模型中关键正则参数𝛌的选择:")
X_train,X_test,Y_train,Y_test = train_test_split(df2,df1,train_size=0.8)
model = Ridge(alpha=0.5,fit_intercept=True)
model = RidgeCV(alphas=[0.01,0.1,0.2, 0.5, 1])
model.fit(X_train,Y_train)
ridge_best_alpha = model.alpha_ #得到最佳lambda值
print(f"岭回归关键正则参数𝛌={ridge_best_alpha}")
ridge = Ridge(alpha = ridge_best_alpha)
ridge.fit(X_train,Y_train)
score=model.score(X_test, Y_test)
print(f"在最优参数𝛌的条件下,可决系数:{round(score,2)}")
print("*************************************************")
print(f"LASSO回归模型中关键正则参数𝛌的选择:")
X_train,X_test,Y_train,Y_test = train_test_split(df2,df1,train_size=0.8)
lasso_cv = LassoCV(alphas = [0.01,0.1,0.2, 0.5, 1], normalize=True, cv = 10)
lasso_cv.fit(X_train,pd.DataFrame(Y_train).values.ravel()) #本来需要一维向量,但是输入为列向量,所以找到出错的位置,应用ravel()函数即可。
lasso_best_alpha = lasso_cv.alpha_ # 取出最佳的lambda值
print(f"LASSO回归关键正则参数𝛌={lasso_best_alpha}")
lasso = Lasso(alpha = lasso_best_alpha)
lasso.fit(X_train,pd.DataFrame(Y_train).values.ravel())
ss=model.score(X_test, Y_test)
print(f"在最优参数𝛌的条件下,可决系数:{round(ss,2)}")
#在最优参数𝛌的条件下的 Lasso 回归模型、岭回归及使用全部12
#个自变量模型的可决系数(十折交叉验证得到的)的对比,在此数据
#集上哪一个模型的精度最高呢?在取定最优参数𝛌的条件下 Lasso回
#归模型中,计算回归系数为零的个数与全部自变量个数(即,12)的比例
print("***************************************************************")
print("任务五")
ll=lasso.coef_
print("各变量回归系数如下:")
print(ll)
ans=0
for i in ll:
if abs(i)<=0.05:
ans+=1
tmp=round(ans/12,2)
tmp=int(tmp*100)
print(f"回归系数为零的个数与全部自变量个数比例:{tmp}%.")
线性判别分析:
############################################
# 第三次实验
# Fisher线性判别分析.py
############################################
from sklearn import discriminant_analysis
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import KFold
import seaborn as sns
#任务一:读取数据集合 估计模型的分类准确率
data=pd.read_csv(r"./pendigits.csv")
x=data.drop('V17',axis=1)
y=data[['V17']]
x_train, x_test, y_train, y_test = train_test_split(x, y,train_size=0.84)
lda=discriminant_analysis.LinearDiscriminantAnalysis()
lda.fit(x_train,pd.DataFrame(y_train).values.ravel()) #消除警告
print("LDA 建模,数据集 pendigits.csv:")
print('Score: %.2f' % lda.score(x_test, y_test))
# 任务二
# 利用十折交叉验证和 Fisher 线性判别准则对数据集 LDA-sparse_data 进行建
# 模,并观察指定模型中相关输入参数 shrinkage 的取值与不指定该参数取值时模
# 型前后之间的差异。
print('高维数据建模,数据集 LDA-sparse_data.csv:')
data1=pd.read_csv(r"./LDA-sparse_data.csv")
x1=data1.drop('label',axis=1)
y1=data1[['label']]
x1_train,x1_test,y1_train,y1_test=train_test_split(x1,y1,train_size=0.8)
shrinkages=np.linspace(0.0,1.0,num=20)
scores=[]
for sh in shrinkages:
lda1=discriminant_analysis.LinearDiscriminantAnalysis(
solver='lsqr',
shrinkage=sh
)
lda1.fit(x1_train, pd.DataFrame(y1_train).values.ravel())
#a1=lda1.coef_ #权重向量
#b1=lda1.intercept_ #截距
scores.append(lda1.score(x1_test, y1_test))
print('指定参数,shrinkage从[0,1]取20个,Score如表所示:')
# x = list(range(1, 11, 1))
# y = [round(i,2) for i in scores]
# #绘制图片
# plt.plot(x,y)
# plt.ylim(0, 1) # 限定纵轴的范围
# for a, b in zip(x, y):
# plt.text(a, b, b)
# plt.show()
print(scores)
lda2=discriminant_analysis.LinearDiscriminantAnalysis()
lda2.fit(x1_train, pd.DataFrame(y1_train).values.ravel())
print('不指定参数 Score: %.2f' % lda1.score(x1_test, y1_test))
# 任务三:模型的适用性
print("*************************************************")
print('高维数据建模,数据集 banana.dat:')
data2=pd.read_csv(r'./banana.dat')
x2=data2.drop(' Class',axis=1)
y2=data2[[' Class']]
avg_floder=0
floder = KFold(n_splits=10) #十折交叉
for train, test in floder.split(x2,y2):
x2_train=x2.iloc[train,:]
x2_test=x2.iloc[test,:]
y2_train=y2.iloc[train,:]
y2_test=y2.iloc[test,:]
lda3=discriminant_analysis.LinearDiscriminantAnalysis()
lda3.fit(x2_train, pd.DataFrame(y2_train).values.ravel())
avg_floder+=lda3.score(x2_test, y2_test)
avg_floder/=10;
print(f"通过十折交叉验证和Fisher线性判别法, 准确率为{round(avg_floder,2)}")
print("***************************散点图如下*****************")
sns.scatterplot(data2['At1'],data2[' At2'],
hue=data2[' Class'],size=data2[' Class'],
style=data2[' Class']) #右图,加上hue参数
主成分分析:
import pandas as pd
import numpy as np
import sklearn.decomposition as dp
import matplotlib.pyplot as plt
data=pd.read_csv(r'./secom.data',delimiter=' ')
num=data.shape[1]
# 2.数据预处理
# 本数据集存在缺失数据,将每列的缺失值补全为该列的所有非缺失值的均值
for column in list(data.columns[data.isnull().sum() > 0]):
mean_val = data[column].mean()
data[column].fillna(mean_val, inplace=True)
# 3.利用 sklearn 模块相关方法进行主成分分析
# (1)画出崖底碎石图,观察此图看是否个主成分的贡献率的差异情况;
model=dp.PCA()
model.fit(data)
plt.plot(model.explained_variance_ratio_)
plt.show()
# (2)选择不同的阈值 0.7,0.8,0.9,筛选出不同个数的主成分;
# (3)计算在不同阈值条件下属性的压缩比,即主成分个数/所有原始数据的属性个数
n_com=[0.7,0.8,0.9]
for n_component in n_com:
pca=dp.PCA(n_components=n_component)
reduced_x=pca.fit_transform(data)
reduced_x= np.dot(data,pca.components_.T)
x=reduced_x.shape[1]
ratio=round(x/num,5)
print(f"在阈值{n_component}下,主成分个数{x}个,压缩比为{ratio}")
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)