三、特征工程
接机器学习1
4、特征降维
4.2、主成分分析PCA
从原始特征空间中找到一个新的坐标系统,使得数据在新坐标轴上的投影能够最大程度地保留数据的方差,同时减少数据的维度。
保留信息/丢失信息=信息保留的比例
from sklearn.decomposition import PCA
参数:n_coponents (小数表示信息比列,整数表示维度,也就是特征多少)
from sklearn.decomposition import PCA
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 实例化一个转化器对象,降维后保留百分之九十五的信息
transfer1 = PCA(n_components=0.95)
data_new1 = transfer1.fit_transform(data)
transfer2 = PCA(n_components=2)
data_new2 = transfer2.fit_transform(data)
print("data_new1:\n",data_new1)
print("data_new2:\n",data_new2)
四、常用算法分类以及步骤
1、实例化预估器
estimator = 预估器方法()
1.1、用于分类的预估器
sklearn.neighbors.KNeighborsClassifier k-近邻
sklearn.naive_bayes.MultinomialNB 贝叶斯
sklearn.linear_model.LogisticRegressioon 逻辑回归
sklearn.tree.DecisionTreeClassifier 决策树
sklearn.ensemble.RandomForestClassifier 随机森林
1.2、用于回归的预估器
sklearn.linear_model.LinearRegression 线性回归
sklearn.linear_model.Ridge 岭回归
1.3、用于无监督学习的预估器
sklearn.cluster.KMeans 聚类
2、训练( fit )
estimator.fit(x_train, y_train)
3、评估
3.1、直接对比 predict
y_predict = estimator.predict(x_test)
y_test == y_predict
3.2、计算准确率 score
accuracy = estimator.score(x_test, y_test)
4、保存模型
import joblib
4.1、保存模型
joblib.dunm(预估器实列化的名称,"路径/名称.pkl")
4.2、使用模型
joblib.load("路径/名称.pkl")
5、模型选择与调优
from sklearn.modele_selection import 具体方法名称
四类方法案例看第五点的KNN算法优化。
5.1、保留交叉验证
train_test_split,简单划分数据集为train和test两类
缺点:1、造成了部分数据不能用于训练模型。2、若类型多,单个类型数据少,那么可能训练没有该类数据,那么之类数据不能被预测。
5.2、k-折交叉验证
KFold/,将数据集划分为k个份数,使用一个份数作为测试,剩下全部用于训练,重复k次,每个数据都能用于训练和测试。
方法:调用预估器的split方法划分数据,返回训练下标和测试下标(迭代器,每次返回一种);在之后正常fit和score得到本次数据集结果,循环到迭代器空。
缺点:并未解决多类别少数据造成的训练类别缺失导致准确率低。
5.3、分层交叉验证
tratifiedKFold,在KFold基础上添加分层,保障每次都由全部的类别可以训练。(流程、参数、结果的操作方法与KFold一致)
5.4、超参数搜索(网格搜索)
上述三类验证都是基于明确操作之后的方法,网格搜索可以变更算法的参数,得到最优设置。
方法:GridSearchCV , 参数1为算法对象;参数2为param_grid 字典形式,键为算法参数名称,值为设置对象,一般为可迭代对象);参数3为cv ,整数,表示交叉验证次数。在KNN中为estimator = GridSearchCV(算法实例化对象, param_grid={"n_neighbors": [1, 3, 5, 7, 9, 11]}, cv=10)
属性:best_params_ 最优参数
best_score_ 最优分数
best_index_ 最优参数下标
best_estimator_ 最优的预估器
cv_results_ 交叉验证描述
五、KNN算法
1、样本距离
1.1、欧式距离
每个方向上的差距平方之后的和的开方, d(A, B) = (方法是勾股定理的多维使用)
1.2、曼哈顿距离
每个方向的差距的绝对值之和, d(A, B) =|
2、KNN算法原理
某个样本的类别:在特征空间内找出距离最近的多个样本,判断这些样本类别最多的一个就是该样本类别。
缺点:对于大量数据集,该方法会全部进行距离运算,就造成了数据计算量太大
3、API
from sklearn.neighbors import KNeighborsClassifier
参数:n_neighbors 整数,代表最近的多少个样本
属性:fit 传入训练数据和训练数据目标
predict 根据传入的测试数据返回类型
score 传入测试数据和测试数据目标,得到准确率
3.1、保留交叉验证
from sklearn.datasets import load_wine
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler# 生成标准化工具
transfer = StandardScaler()
# 加载数据集
wine = load_wine()
# 将数据集的数据转化成标准数据
wine_date1 = transfer.fit_transform(wine.data)
# 将标准数据和目标划分
x_train, x_test, y_train, y_test = train_test_split(wine_date1, wine.target, train_size=0.75, random_state=666, stratify=wine.target)
print(x_train.shape,y_train.shape,x_test.shape,y_test.shape)# 生成模型工具,判断距离最近的七个内容
model = KNeighborsClassifier(n_neighbors=7)
# 传入标准化的训练数据和对应结果
model.fit(x_train, y_train)
# 传入标准化的测试数据得到模型预测结果
# 方式1
y_test_result = model.predict(x_test)
res = y_test_result==y_test
# 方式2
score = model.score( x_test,y_test)
score
3.2、KFold
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler# 获取数据集和目标集
x,y = load_iris(return_X_y=True)
# 使用分层k折交叉验证 n_splits折叠次数, shuffle 打乱顺序 ,random_state 随机值,保障重复
folder = KFold(n_splits=5, shuffle=True, random_state=666)
# 根据分层折叠,划分数据集并返回下标
iter = folder.split(x,y)
# 创建模型对象
knn = KNeighborsClassifier(n_neighbors=5)
# 创建标准化工具
transfer = StandardScaler()
# 使用空列表存储五次折叠中的每个计算结果
score = []
score_standard = []
# 循环取出五次折叠的数据下标
for train_index, test_index in iter:# 未标准化数据knn.fit(x[train_index],y[train_index])score.append(knn.score(x[test_index], y[test_index]))# 标准化数据# 将训练数据标准化x_train_data = transfer.fit_transform(x[train_index])# genuine下标获取对应训练数据和目标结果传入模型训练knn.fit(x_train_data,y[train_index])# 对测试数据标准化x_test_data = transfer.transform(x[test_index])# 根据测试数据获得准确率,存入列表score_standard.append(knn.score(x_test_data, y[test_index]))
# 根据分层折叠,划分数据集并返回下标
print(score,'\n', sum(score)/len(score))
print(score_standard,'\n', sum(score_standard)/len(score_standard))
3.3、分层交叉验证
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler# 获取数据集和目标集
x,y = load_iris(return_X_y=True)
# 使用分层k折交叉验证 n_splits折叠次数, shuffle 打乱顺序 ,random_state 随机值,保障重复
folder = StratifiedKFold(n_splits=5, shuffle=True, random_state=666)
# 根据分层折叠,划分数据集并返回下标
iter = folder.split(x,y)
# 创建模型对象
knn = KNeighborsClassifier(n_neighbors=5)
# 创建标准化工具
transfer = StandardScaler()
# 使用空列表存储五次折叠中的每个计算结果
score = []
score_standard = []
# 循环取出五次折叠的数据下标
for train_index, test_index in iter:# 未标准化数据knn.fit(x[train_index],y[train_index])score.append(knn.score(x[test_index], y[test_index]))# 标准化数据# 将训练数据标准化x_train_data = transfer.fit_transform(x[train_index])# genuine下标获取对应训练数据和目标结果传入模型训练knn.fit(x_train_data,y[train_index])# 对测试数据标准化x_test_data = transfer.transform(x[test_index])# 根据测试数据获得准确率,存入列表score_standard.append(knn.score(x_test_data, y[test_index]))
# 根据分层折叠,划分数据集并返回下标
print(score,'\n', sum(score)/len(score))
print(score_standard,'\n', sum(score_standard)/len(score_standard))
3.4、超参数搜索
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV# 获取数据集和目标集
x,y = load_iris(return_X_y=True)
#x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25,shuffle=True, random_state=666)
# 创建模型对象
knn = KNeighborsClassifier()
# 进行网格搜索和交叉验证
knn = GridSearchCV(knn,param_grid={'n_neighbors' :range(1,11,2)},cv=15)
knn.fit(x,y)print("最佳参数:\n", knn.best_params_)
# 最佳结果:best_score_
print("在训练集中的准确率:\n", knn.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器:\n", knn.best_estimator_)
# 交叉验证结果:cv_results_
print("交叉验证过程描述:\n", knn.cv_results_)
#最佳参数组合的索引:最佳k在列表中的下标
print("最佳参数组合的索引:\n",knn.best_index_)