一,特征降维

1,低方差过滤

将方差低于某个值的特征过滤掉。

import numpy as np
from sklearn.feature_selection import VarianceThreshold
from sklearn.preprocessing import StandardScaler
from sklearn import datasets
import scipy
x,y = datasets.load_iris(return_X_y=True)
print(x.shape)
#标准化
x = StandardScaler().fit_transform(x)
#方差过滤
x1 = VarianceThreshold(threshold=0.2).fit_transform(x)
print(x1.shape)

2,相关系数选择

相关系数绝对值大于某个值,就选取该特征。协方差/(某特征的标准差*y的标准差)

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn import datasets
import scipy
dia = datasets.load_diabetes()  #糖尿病数据集
x = dia.data
y = dia.target
x_names = dia.feature_names
#标准化
x = StandardScaler().fit_transform(x)
y = StandardScaler().fit_transform(np.array([y]).T)
y = y.T[0]

#相关系数
rs = []
for i in range(x.shape[1]):
    r = scipy.stats.pearsonr(x[:,i],y)
    if r.statistic >= 0.4 or r.statistic <= -0.4:
        rs.append(x_names[i])
print(rs)

3,主成分分析

选取主要成分,并选取前n个最大信息特征向量,满足信息量比。主成分分析保留最大程度的方差。

成分i,y_{i}=a_{i1}x_{i1}+a_{i2}x_{i2}+...+a_{in}x_{in}

from sklearn.datasets import fetch_20newsgroups
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.feature_extraction import text
import jieba
#数据读取
data = fetch_20newsgroups(data_home=r"D:\xuexi\d1\jqxx\data\src")
x= data.data[0:4000] #读取4000条数据
y=data.target[0:4000]
ynames = data.target_names
#特征提取
tf = text.TfidfVectorizer()
x = tf.fit_transform(x)
#数据分割
x_train,x_test,y_train,y_test = train_test_split(x,y)
x_train = x_train.toarray()
x_test = x_test.toarray()
print(x_test)
#数据标准化
sta = StandardScaler()
x_train = sta.fit_transform(x_train)
x_test = sta.fit_transform(x_test)
#主成分分析
pca = PCA(n_components=0.8)
x_train1 = pca.fit_transform(x_train)
print(x_train.shape)
print(x_train1.shape)

二,KNN分类

1,距离

(1)欧式距离

\sqrt{\sum_{k=1}^{n}\left ( xik-xjk \right )^{2} }

i,j是i样本和k样本,k是特征下标

(2)曼哈顿距离

\sum_{k=0}^{n}\left | x_{ik}-y_{jk} \right |

(3)切比雪夫距离

max(\left | x_{ik}-x_{jk} \right |)

2,算法原理

计算当前预测的和已有的数据每一个距离。进行排序,选取前K个的最小距离类别,进行统计,最多的类就是预测的类。

from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

#加载数据
wine = load_wine()
x = wine.data
y = wine.target
y_names = wine.target_names
#标准化
x = StandardScaler().fit_transform(x)
#数据分割
x_train,x_test,y_train,y_test = train_test_split(x,y)
#KNN
knn = KNeighborsClassifier(n_neighbors=6)
knn.fit(x_train,y_train)
print((knn.predict(x_test) == y_test))
print(knn.score(x_test,y_test))

三,朴素贝叶斯

1,朴素贝叶斯

理论公式:p(yi/(x1..xn)) = (p(x1/yi)*p(x2/yi)*...*p(xn/yi)*p(yi))/(p(x1)*...*p(xn)),其中i为y种类下标

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB

#加载数据
wine = load_wine()
x = wine.data
y = wine.target
y_names = wine.target_names
#数据分割
x_train,x_test,y_train,y_test = train_test_split(x,y)
#朴素贝叶斯
bys = MultinomialNB()
bys.fit(x_train,y_train)
print(bys.score(x_test, y_test))

2,拉普拉斯平滑系数

某些事件或特征可能从未出现过,这会导致它们的概率被估计为零。

p(xi/yj) = (num(xi)+a)/(num(yi)+a*n) 其中num()表示数量,n为总特征数量,a为平滑系数,一般取

四,模型调优

1,交叉验证

(1)将数据分为训练集和测试集,训练集训练数据,测试集测试数据。

(2)将数据划分n堆,对n-1堆进行训练,对1堆进行测试。分n轮进行操作。第i论就i堆进行测试,其他的训练。

(3)按不同类别比例分配每堆的数据

2,超参数搜索

超参数搜索也叫网格搜索。比如在KNN算法中,k是一个可以人为设置的参数,所以就是一个超参数。网格搜索能自动的帮助我们找到最好的超参数值。

from sklearn.datasets import fetch_20newsgroups
from sklearn.preprocessing import StandardScaler
from sklearn.feature_extraction import text
from sklearn.feature_selection import VarianceThreshold
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.decomposition import PCA
#数据加载
news = fetch_20newsgroups(data_home=r"D:\xuexi\d1\jqxx\data\src")
x = news.data[0:4000]
y = news.target[0:4000]
y_names = news.target_names
#数据特征提取
x = text.TfidfVectorizer().fit_transform(x)
x = x.toarray()
#数据标准化
x = StandardScaler().fit_transform(x)
#数据降维
x = VarianceThreshold(threshold=0.3).fit_transform(x)#过滤方差小于0.3
pca = PCA(n_components=0.9)#主成分分析
x = pca.fit_transform(x)
#数据交叉验证和超参数搜索
knn = KNeighborsClassifier(n_neighbors=7)
models = GridSearchCV(knn,param_grid={"n_neighbors":range(4,10)},cv=5)
models.fit(x[0:3900,:],y[0:3900])

print(y_names[models.predict([x[3980,:]])[0]])
print(models.score(x[3900:,:],y[3900:]))

上述代码数据特征不太准确,建议再进行特征降维或换算法进行分类

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐