sklearn机器学习从入门到入土
- 本系列文旨在记录自己在使用skearn当中做的项目和经验,为以后的自己提供一些参考.
- 平时自己总是间隔很长一段时间再拿起来某些东西,这样自然而然就会有些遗忘,甚至连最基本的东西也会遗忘,所以就写下这些系列文章作为以后的参考,也给初学者一个指引
- 本文建议对python基础很强,并自学能力很强的人阅读,如果python基础并不扎实,建议读我以前写的文章python_basic
环境搭建
本系列文章使用的是Jupyter lab和jupyter
建议从anaconda中安装jupyter lab,安装anaconda就不过多赘述,看之前写的文章就行
启动jupyter lab建议
数据导入
第一步一般都是读取数据这里一般使用pandas读取csv或者xlsx文件
#读取xlsx
pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None,
usecols=None, squeeze=False,dtype=None, engine=None,
converters=None, true_values=None, false_values=None,
skiprows=None, nrows=None, na_values=None, parse_dates=False,
date_parser=None, thousands=None, comment=None, skipfooter=0,
convert_float=True, **kwds)
#读取csv
pd.read_csv("./pre_data.csv")
详细说明 https://blog.csdn.net/weixin_38546295/article/details/83537558
Dataframedata.isna().sum()
统计每一列有没有空值
test_dataset = dataset.drop(train_dataset.index)
删除某个行标签的数据
test_dataset = dataset.drop(columns="Weight")
删除某一列
train_dataset = dataset.sample(frac=0.8,random_state=0)
随机抽样,frac 取样本的80%
pre_train_data.keys() 和 pddata.columns 效果一样
获取column label
pddata.iloc[1:,0]
第二行到最后,第一列
pcadata[["净利润增长率(%)_Netprfgrrt"]]
取子集 好处是能取多列
pcadata.info()
object类型就是有空格
concat
连接 axes=0,=1
降维算法
数据预处理
最简单的案例
先放一个超级简单的PCA降维例子
x = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(x)
# [[-1 -1]
# [-2 -1]
# [-3 -2]
# [ 1 1]
# [ 2 1]
# [ 3 2]]
pca = PCA(n_components=1) # 降成一维
newx = pca.fit_transform(x) # 获取结果矩阵
print(newx)
# [[ 1.38340578]
# [ 2.22189802]
# [ 3.6053038 ]
# [-1.38340578]
# [-2.22189802]
# [-3.6053038 ]]
print(pca.explained_variance_ratio_) # 查看结果矩阵的各贡献度
# [0.99244289]
iris案例
接下来用iris_data来做一个PCA案例
第一步导入包和数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
iris_data = load_iris();
y = iris_data.target
x = iris_data.data
print(x.shape) # (150, 4)
pd.DataFrame(x)
然后查看可以降到几维
当参数n_components中不填写任何值,则默认返回min(X.shape)个特征,一般来说,样本量都会大于特征数目, 所以什么都不填就相当于转换了新特征空间,但没有减少特征的个数。一般来说,不会使用这种输入方式。但我们 却可以使用这种输入方式来画出累计可解释方差贡献率曲线,以此选择最好的n_components的整数取值。
pca_line = PCA().fit(x.data)
print(x.data.shape) #(150, 4)
print(np.arange(1,x.data.shape[1]+1)) # np.arange() 返回固定步长的数组 [1 2 3 4]
plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_))
plt.xticks([1,2,3,4]) #这是为了限制坐标轴显示为整数
plt.xlabel("number of components after dimension reduction")
plt.ylabel("cumulative explained variance ratio")
plt.show()
经过上一步之后就可以发现降到二维是比较合适的选择
pca = PCA(n_components=2) # 降到二维
pca = pca.fit(x)
x_dr = pca.transform(x)
# print(x_dr)
print(x_dr[:,0][y == 1]) # 降维之后第一列中y ==1 的x数据
print(x_dr.shape) # (150, 2)
print(min(x.shape)) # 4
降维之前的图像
colors = ['red', 'black', 'orange']
plt.figure
for i in [0,1,2]:
plt.scatter(x[:,0][y == i],x[:,1][y == i],alpha=.7,c = colors[i],label = iris_data.target_names[i])
plt.legend()
plt.title('IRIS dataset')
plt.show()
降维之后的图像
# 降维之后的图像
colors = ['red', 'black', 'orange']
plt.figure()
for i in [0, 1, 2]:
plt.scatter(x_dr[y == i, 0],x_dr[y == i, 1] # 取y == i 数据的第0列和第1列
,alpha=0.7
,c=colors[i]
,label=iris_data.target_names[i]
)
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()
比较重要的几个数据
print(pca.explained_variance_) # 可解释性方差大小 [4.22824171 0.24267075]
print(pca.explained_variance_ratio_) # 方差贡献率 [0.92461872 0.05306648]
print(pca.explained_variance_ratio_.sum()) # 0.9776852063187949
另外一个选择维度的方法,除了输入整数,n_components还有哪些选择呢? 勤奋智慧的数学大神Minka, T.P.在麻省理工学院媒体实验室做研究时找出了让PCA用最大似然估计(maximum likelihood estimation)自选超参数的方法
pca_mle = PCA(n_components="mle")
pca_mle = pca_mle.fit(x)
x_mle = pca_mle.transform(x)
x_mle.shape