特征选择
VarianceThreshold(低方差过滤特征选择):
类似于之前openCV中的threshold函数,只是此在创建实例工具时在参数中设置用于筛选的阈值。因为目前来说基本所有的工具的操作方式大致相同,都是引用后进行调用。
emm,根据AI的回答:在使用fit后,方法本身并不返回固定值,只是更新模型的属性,而在此方法中,这些属性包括了特征方差等信息。
我不理解的点:因为我在创建实例对象时就已经设定了阈值参数,然后在我fit后我留下应该是需要的特征,而当我使用transform时,应该是直接根据我fit获取需要特征直接提取这些特征。
我的理解有误,fit方法并不返回任何值,它只计算训练数据集中每个特征的方差并记录,还确定了那些特征的方差高于阈值,这些信息被储存在variances_属性中,它还储存了一个实际使用的阈值,当用户没有指定时,这个值由fit来计算,最后储存在threshold _属性中,注意是fit事实上并不会修改任何值
fit更新后,transform使用更新后的方差和阈值进行特征过滤,而tranform则是实际执行特征选择的地方
python
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
data=pd.DataFrame([[10,1],[11,3],[11,1],[11,5],[11,9],[11,3],[11,2],[11,6]])
transfer = VarianceThreshold(threshold=1.5)# 设置阈值方差
res = transfer.fit_transform(data)
print(res)
根据相关系数的特征选择
这里的系数就是使用皮尔逊系数来进行判断了。从scipy.stats中引入pearsonr方法,此方法返回的是两个值,一个statistic,此数的范围为[-1,1],其值越接近两边的1相关性越强,而另一个职为pvalue这个值只做了解,它是数值越小越相关。
主成分分析(PCA)
没有办法很清楚的解释,大致的解释只能是:PCA的核心目标是从原始特征空间中找到一个新的坐标系统,使得数据在新坐标轴上的投影能够最大程度地保留数据的方差,同时减少数据的维度。
然后就只能介绍一下PCA的用法,
python
from sklearn.decomposition import PCA
# 然后是方法的调用
data = [[2,8,4,5],
[6,3,0,8],
[5,4,9,1]]
transfer = PCA(n_components=2)
# 注意的是PCA的实例创建时的参数,n_components,当它为大于一的整数时,表示减少至多少特征
# 当它为小于1大于0的小数时,表示保留多少比例的信息
res = transfer.fit_transform(data)
print(res)
KNN算法
K-近邻算法,根据K个邻居样本的类别来判断当前样本的类别;
如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别
比如: 有10000个样本,选出7个到样本A的距离最近的,然后这7个样本中假设:类别1有2个,类别2有3个,类别3有2个.那么就认为A样本属于类别2,因为它的7个邻居中 类别2最多(近朱者赤近墨者黑)
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
iris = load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)
standard = StandardScaler()
x_train = standard.fit_transform(x_train)
x_test = standard.transform(x_test)
transfer = KNeighborsClassifier(n_neighbors=7)
transfer.fit(x_train,y_train)
y_predict = transfer.predict(x_test)
score = transfer.score(x_test,y_test)
score
交叉验证
1 .保留交叉验证
在这种交叉验证技术中,整个数据集被随机地划分为训练集和验证集。根据经验法则,整个数据集的近70%被用作训练集,其余30%被用作验证集。也就是我们最常使用的,直接划分数据集的方法。
优点:很简单很容易执行
缺点:不适合不平衡的数据集,一大块数据被剥夺了训练模型的机会
2.k-折交叉验证
K-Fold交叉验证技术中,整个数据集被划分为K个大小相同的部分。每个分区被称为 一个"Fold"。所以我们有K个部分,我们称之为K-Fold。一个Fold被用作验证集,其余的K-1个Fold被用作训练集。
3.分层k-折交叉验证Stratified k-fold
K-折交叉验证的变种, 分层的意思是说在每一折中都保持着原始数据中各个类别的比例关系,比如说:原始数据有3类,比例为1:2:1,采用3折分层交叉验证,那么划分的3折中,每一折中的数据类别保持着1:2:1的比例,这样的验证结果更加可信。
例子的话是关于k-折交叉验证的
# 分层k-折交叉验证
from sklearn.datasets import load_iris
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 加载数据
iris = load_iris()
x = iris.data
y = iris.target
# 初始化分层k-折交叉验证器
strat_k_fold = StratifiedKFold(n_splits=5,shuffle=True,random_state=42)
# 创建一个k近邻分类器实例
knn = KNeighborsClassifier(n_neighbors=7)
# # 进行交叉认证
accuracies = []
for train_index ,test_index in strat_k_fold.split(x,y):
x_train,x_test = x[train_index],x[test_index]
y_train,y_test = y[train_index],y[test_index]
# 数据预处理(标准化)
scaler = StandardScaler()
x_train_scaler = scaler.fit_transform(x_train)
x_test_scaler = scaler.transform(x_test)
# 使用k近邻分类器进行训练
knn.fit(x_train_scaler,y_train)
# # 输出每次折叠的准确得分
score = knn.score(x_test,y_test)
# print(score)
accuracies.append(score)
print(sum(accuracies)/len(accuracies)) # 平均得分
超参数搜索
今天老师讲的最后的一个问题
超参数搜索也叫网格搜索(Grid Search)
比如在KNN算法中,k是一个可以人为设置的参数,所以就是一个超参数。网格搜索能自动的帮助我们找到最好的超参数值。
from sklearn.model_selection import GridSearchCV
此API同时进行交叉验证和网格搜索,而GridSearchCV实际也是一个估计器,它有以下几个重要的参数:
best_params_ 最佳参数
best_score_ 在训练集中的准确率
best_estimator_ 最佳估计器
cv_results_ 交叉验证过程描述
best_index_最佳k在列表中的下标
依旧是鸢尾花的分类示例
#%%
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
iris = load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)
standard = StandardScaler()
x_train = standard.fit_transform(x_train)
x_test = standard.transform(x_test)
knn = KNeighborsClassifier()
estimator = GridSearchCV(estimator=knn,param_grid={"n_neighbors":[1,3,5,7,9,11]},cv=5)
estimator.fit(x_train,y_train)
# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("在测试集中的准确率为:\n", score) #0.9736842105263158
# 最佳参数:best_params_
print("最佳参数:\n", estimator.best_params_) #{'n_neighbors': 3}, 说明k=3时最好
# 最佳结果:best_score_
print("在训练集中的准确率:\n", estimator.best_score_) #0.9553030303030303
# 最佳估计器:best_estimator_
print("最佳估计器:\n", estimator.best_estimator_) # KNeighborsClassifier(n_neighbors=3)
# 交叉验证结果:cv_results_
print("交叉验证过程描述:\n", estimator.cv_results_)
#最佳参数组合的索引:最佳k在列表中的下标
print("最佳参数组合的索引:\n",estimator.best_index_)