降維PCA&LDA&數(shù)據(jù)預(yù)處理(preprocessing)

# pca 降維看效果
# decomposition分解
from sklearn.decomposition import PCA
# n_components=None 這個參數(shù) 可以是整數(shù) 也 可以是小數(shù) 整數(shù)表示保留幾個特征 小數(shù)表示保留的比例
pca = PCA(n_components=2)
pca.fit(data)  # 這里只需要特征值 不需要目標(biāo)值 (lda 既要特征值 也要 目標(biāo)值 因為要計算各組 直接的做大差異)
pca_data = pca.transform(data)  # 轉(zhuǎn)換
plt.scatter(pca_data[:,0],pca_data[:,1],c=target)
plt.scatter(data[:,0],data[:,1],c=target)
def cross_verify(data,target,model):
    scores = []
    for i in [0.1,0.2,0.3]:
        X_train,X_test,y_train,y_test = train_test_split(data,target,test_size=i)
        model.fit(X_train,y_train)
        score = model.score(X_test,y_test)
        scores.append(score)
    return np.array(scores).mean()
# 這里傳入的是 pca降維后的數(shù)據(jù)
cross_verify(pca_data,target,KNeighborsClassifier())
# 降低了維度 準(zhǔn)確率沒有受到太大影響
# LDA discriminant_analysis判別分析
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# n_components 指定保留的維度
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(data,target)  # lda需要指定分組情況 才能找到各組直接中心距離最大的位置
# 所以 既要傳入 特征值 也要 傳入 目標(biāo)值(和pca不同)
lda_data = lda.transform(data)
plt.scatter(lda_data[:,0],lda_data[:,1],c=target)
plt.scatter(pca_data[:,0],pca_data[:,1],c=target)
cross_verify(lda_data,target,KNeighborsClassifier())
# sklearn官網(wǎng)
# MinMaxScaler 區(qū)間歸一化 (當(dāng)前值-最小值)/(最大值-最小值)
# StandardScaler 標(biāo)準(zhǔn)化 (當(dāng)前值-平均值)/標(biāo)準(zhǔn)差
# Normalizer 歸一化 (當(dāng)前值-平均值)/(最大值-最小值)
# Binarizer 二值化 (這里就不嘗試了 主要用來處理圖片)
from sklearn.preprocessing import MinMaxScaler,Normalizer,StandardScaler,Binarizer
# MinMaxScaler()
mms = MinMaxScaler()
mms.fit(data)
mms.transform(data)
minmax_data = MinMaxScaler().fit_transform(data)
normal_data = Normalizer().fit_transform(data)
standard_data = StandardScaler().fit_transform(data)
X_train1, X_test1, y_train1, y_test1 = train_test_split(data,target,test_size=0.25)  # 沒有處理的數(shù)據(jù)
X_train2, X_test2, y_train2, y_test2 = train_test_split(minmax_data,target,test_size=0.25)
X_train3, X_test3, y_train3, y_test3 = train_test_split(normal_data,target,test_size=0.25)
X_train4, X_test4, y_train4, y_test4 = train_test_split(standard_data,target,test_size=0.25)
# 使用一些分類模型去嘗試 knn lgc dtree nb svc
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
knn = KNeighborsClassifier()
lgc = LogisticRegression()
dtree = DecisionTreeClassifier()
gnb = GaussianNB()
svc = SVC()

封裝函數(shù) 使用各種模型 對 各種處理后的 數(shù)據(jù) 進(jìn)行測試

選擇 使用 哪一種 預(yù)處理方式

def select_preprocessor(model,name,X_train, X_test, y_train, y_test):
    model.fit(X_train,y_train)
    score = model.score(X_test,y_test)
    print("{}模型 {}處理的數(shù)據(jù) 得分是{}".format(model.__class__.__name__,name,score))
select_preprocessor(knn,'未',X_train1, X_test1, y_train1, y_test1 )
select_preprocessor(knn,'minmax',X_train2, X_test2, y_train2, y_test2 )
select_preprocessor(knn,'normal',X_train3, X_test3, y_train3, y_test3 )
select_preprocessor(knn,'standard',X_train4, X_test4, y_train4, y_test4 )

normal肯定是不用了 #其他方式都差不多 就可以不處理了

選擇模型 選擇模型是選擇表現(xiàn)比較穩(wěn)定的

使用不處理的 數(shù)據(jù) 對模型進(jìn)行訓(xùn)練 看分?jǐn)?shù)

def select_model(model,data,target,rate):
    X_train, X_test, y_train, y_test = train_test_split(data,target,test_size=rate)
    model.fit(X_train,y_train)
    score = model.score(X_test,y_test)
    print(model.__class__.__name__+':'+str(score))
    return score
# 傳入一個列表 列表里面都是 各種模型
def select_model2(models,data,target):
    for model in models:
        score1 = select_model(model,data,target,0.1)
        score2 = select_model(model,data,target,0.2)
        score3 = select_model(model,data,target,0.3)
        # 主要想看的是 平均分 和 標(biāo)準(zhǔn)差
        nd = np.array([score1,score2,score3])
        print('平均分:%f 標(biāo)準(zhǔn)差:%f'%(nd.mean(),nd.std()))
        print('\n')   
select_model2([knn,lgc,dtree,gnb,svc],data,target)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容