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))]