10折交叉驗證中數據集的簡易劃分方式總結

DataFrame中自己手動做10折交叉驗證時,實現採樣出一折後,對原始的總的數據的索引集合與採樣出的那一折的索引集合做差,獲得另外的9折的索引用於構造訓練集。

"""1.10折交叉驗證中數據的隨機劃分函數"""
def cross_10folds(path,columns1):
    import pandas as pd
    #data=pd.read_csv(path)[:100]  #經驗證劃分完全正確
    data=pd.read_csv(path)
    #將數據集隨機打散
    data.sort_index(inplace=True)
    data.columns=columns1
    folds=10
    df_test=data.sample(n=int(data.shape[0]/folds))  #數據剛好可以做10折交叉驗證。
    df_test_index=list(df_test.index)
    #下面是索引做差集的關鍵原理和代碼
    df_test_flag=data.index.isin(df_test_index)  #轉換爲list來判定成員資格
    diff_flag = [not f for f in df_test_flag] # 不是df_test_flag裏面的索引的索引記爲df_train_index的索引集合
    df_train= data[diff_flag]
    return df_train,df_test
path='C:/Users/Administrator/Desktop/zhou1.csv'
columns=['cid','side_effects']
df_train,df_test=cross_10folds(path,columns)


"""2.如果進行10次10折交叉驗證"""
path='C:/Users/Administrator/Desktop/zhou1.csv'
columns=['cid','side_effects']
for i in range(1,11):
    df_train,df_test=cross_10folds(path,columns)
    #下面的代碼還不能運行,僅代表思路,數據還得處理成數值後纔可使用。
    from sklearn.model_selection import train_test_split
    X_train,X_test,y_train,y_test=train_test_split( df_train[:-1],df_train[-1], test_size=0.33, random_state=42)
    #下面是數據的標準化
    from sklearn.preprocessing import StandardScaler
    ss=StandardScaler()
    X_train=ss.fit_transform(X_train)
    X_test=ss.transform(X_test)
    #交叉驗證階段
    from sklearn.cross_validation import cross_val_score
    from sklearn.ensemble import RandomForestClassifier
    rfc=RandomForestClassifier()
    cross_val_score(rfc,X_train,y_train,cv=5) #5折交叉驗證
    #模型訓練
    rfc.fit(X_train,y_train)
    #預測
    y_predict=rfc.predict(X_test)
    print("準確率:ACC=",rfc.score(y_predict,y_test))
    
    

import pandas as pd
data=pd.read_csv('C:/Users/Administrator/Desktop/zhou1.csv')
data.columns=['cid','side_effects']
folds=10
df_test=data.sample(n=int(data.shape[0]/folds))  #數據剛好可以做10折交叉驗證。
df_test.index=range(len(df_test))
df_test_index=list(df_test.index)
data_index=list(data.index)
#前面也可以是DataFrame的某一個屬性列的內容
#df_test_flag=data[data.columns[0]].isin(df_test.index) 
df_test_flag=data.index.isin(df_test.index)  #都轉換爲list來判定成員資格
diff_flag = [not f for f in df_test_flag] # 不是df_test_flag裏面的索引的索引記爲df_train_index的索引集合
df_train= data[diff_flag] # 重置index 
#df_train.index = [i for i in range(len(df_train))]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章