多元统计分析

线性回归分析:

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}")
 

你可能感兴趣的