【備忘録】pandas.DataFrameに関するメモ
・データフレームに対して.info()メソッドを使うと、空白やNull値の有無を確認できる。
・データフレームに対して.describe()メソッドを使うと、定量データのコラムについての概要が確認できる。
・データフレームに対して.describe(include=["O"])と引数(アルファベットをO(オー))を指定すれば、カテゴリカルデータの特徴を知ることができる。
・名前で参照するときにはloc属性を使う。インデックス位置による参照の時はiloc属性を使う。
【kaggle】タイタニックのコンペ(7)
Kaggleで定番のタイタニック号の生存者の分析をPythonで行う記録。
↓コンペのサイトはここです。
Titanic: Machine Learning from Disaster | Kaggle
Pythonによる分析の一例をManav Sehgalさんのカーネルを参考に(と言いうかこれに沿って)行います。
↓Manav Sehgalさんの分析手順はここで確認ができます。
Titanic Data Science Solutions | Kaggle
18. モデル、予測、解決
・今までのプロセスでデータの予測をする準備が整った。
・たくさんの予測モデルがある中で、課題の内容に即したモデルを選ぶ必要gあある。
・今回の課題は分類(classification)と回帰(regression)の内容である。
・生存の有無と各変数の関係を知りたい。
・今回は教師あり学習である。
・「教師あり学習」と「分類及び回帰」に適した予測方法には以下がある。
- Logistic Regression:ロジスティック回帰
- KNN or k-Nearest Neighbors:k近傍法
- Support Vector Machines:サポートベクターマシン
- Naive Bayes classifier:ナイーブベイズ分類器
- Decision Tree:決定木
- Random Forrest:ランダムフォレスト
- Perceptron:パーセプトロン
- Artificial neural network:人工ニューラルネットワーク
- RVM or Relevance Vector Machine:関連ベクトルマシン
#不要な属性を取り除く。 train_df=train_df.drop(['FamilySize','Age','AgeBand','Fare_category','SibSp','Parch'],axis=1) train_df.info() ''' <class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 9 columns): Survived 891 non-null int64 Pclass 891 non-null int64 Sex 891 non-null int32 Fare 891 non-null int32 Embarked 891 non-null int32 Title 891 non-null int64 Age_category 891 non-null float64 IsAlone 891 non-null int64 Age*Class 891 non-null float64 dtypes: float64(2), int32(3), int64(4) memory usage: 52.3 KB ''' test_df=test_df.drop(['FamilySize','Age','Fare_category','SibSp','Parch'],axis=1) test_df.info() ''' <class 'pandas.core.frame.DataFrame'> RangeIndex: 418 entries, 0 to 417 Data columns (total 9 columns): PassengerId 418 non-null int64 Pclass 418 non-null int64 Sex 418 non-null int32 Fare 418 non-null int32 Embarked 418 non-null int32 Title 418 non-null int64 Age_category 418 non-null float64 IsAlone 418 non-null int64 Age*Class 418 non-null float64 dtypes: float64(2), int32(3), int64(4) memory usage: 24.6 KB ''' #モデルに当てはめるための前処理 X_train=train_df.drop('Survived',axis=1) Y_train=train_df['Survived'] X_test=test_df.drop('PassengerId',axis=1).copy() X_train.shape, Y_train.shape, X_test.shape #出力:((891, 8), (891,), (418, 8)) from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC, LinearSVC from sklearn.ensemble import RandomForestClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.naive_bayes import GaussianNB from sklearn.linear_model import Perceptron from sklearn.linear_model import SGDClassifier from sklearn.tree import DecisionTreeClassifier
・Logistic Regression:ロジスティック回帰
logreg=LogisticRegression() logreg.fit(X_train,Y_train) Y_pred=logreg.predict(X_test) acc_log=round(logreg.score(X_train,Y_train)*100,2) acc_log #出力:80.92
#ロジスティック回帰では各属性の係数を計算することで、それぞれが結果に与える影響を検証することが可能である。正の係数は生存確率を高め、負の係数は生存確率を低くする。Sexは女性が0,男性が1なので、男性に方が生存確率を低くすることが分かる。 coeff_df=pd.DataFrame(train_df.columns.delete(0)) coeff_df.columns=['Feature'] coeff_df['Correlation']=pd.Series(logreg.coef_[0]) coeff_df.sort_values(by='Correlation',ascending=False) ''' Feature Correlation 4 Title 0.440642 6 IsAlone 0.377805 3 Embarked 0.292706 2 Fare 0.061489 7 Age*Class -0.138891 5 Age_category -0.217198 0 Pclass -0.885901 1 Sex -2.119842 '''
・Support Vector Machines:サポートベクターマシン
svc=SVC() svc.fit(X_train,Y_train) Y_pred=svc.predict(X_test) acc_svc=round(svc.score(X_train,Y_train)*100,2) acc_svc #出力:83.5
・KNN or k-Nearest Neighbors:k近傍法
knn=KNeighborsClassifier(n_neighbors=3) knn.fit(X_train,Y_train) Y_pred=knn.predict(X_test) acc_knn=round(knn.score(X_train,Y_train)*100,2) acc_knn #出力:83.95
・Naive Bayes classifier:ナイーブベイズ分類器
gaussian=GaussianNB() gaussian.fit(X_train,Y_train) Y_pred=gaussian.predict(X_test) acc_gaussian=round(gaussian.score(X_train,Y_train)*100,2) acc_gaussian #出力:76.88
・Perceptron:パーセプトロン
perceptron=Perceptron() perceptron.fit(X_train,Y_train) Y_pred=perceptron.predict(X_test) acc_perceptron=round(perceptron.score(X_train,Y_train)*100,2) acc_perceptron #出力:78.45
・線形SVM
linear_svc=LinearSVC() linear_svc.fit(X_train,Y_train) Y_pred=linear_svc.predict(X_test) acc_linear_svc=round(linear_svc.score(X_train,Y_train)*100,2) acc_linear_svc #出力:79.57
・Stochastic Gradient Descent:確率的勾配降下法
sgd = SGDClassifier() sgd.fit(X_train, Y_train) Y_pred = sgd.predict(X_test) acc_sgd = round(sgd.score(X_train, Y_train) * 100, 2) acc_sgd #出力:78.68
・Decision Tree:決定木
decision_tree = DecisionTreeClassifier() decision_tree.fit(X_train, Y_train) Y_pred = decision_tree.predict(X_test) acc_decision_tree = round(decision_tree.score(X_train, Y_train) * 100, 2) acc_decision_tree #出力:86.64
・Random Forrest:ランダムフォレスト
random_forest = RandomForestClassifier(n_estimators=100) random_forest.fit(X_train, Y_train) Y_pred = random_forest.predict(X_test) random_forest.score(X_train, Y_train) acc_random_forest = round(random_forest.score(X_train, Y_train) * 100, 2) acc_random_forest #出力:86.64
・モデルの精度を比較する。
models=pd.DataFrame({ 'Model':['Support Vector Machines','KNN','Logistic Regression', 'Random Forest','Naive Bayes','Perceptron', 'Stochastic Gradient Decent','Linear SVC', 'Decesion Tree'], 'Score':[acc_svc,acc_knn,acc_log,acc_random_forest,acc_gaussian, acc_perceptron,acc_sgd,acc_linear_svc,acc_decision_tree]}) models.sort_values(by='Score',ascending=False) '''出力 Model Score 3 Random Forest 86.64 8 Decesion Tree 86.64 1 KNN 83.95 0 Support Vector Machines 83.50 2 Logistic Regression 80.92 7 Linear SVC 79.57 6 Stochastic Gradient Decent 78.68 5 Perceptron 78.45 4 Naive Bayes 76.88 ''' #提出するデータを作成する。 submission=pd.DataFrame({'PassengerId':test_df['PassengerId'], 'Survived':Y_pred}) submission.head() '''出力 PassengerId Survived 0 892 0 1 893 1 2 894 0 3 895 0 4 896 1 ''' #submissionをcsv形式で書き出し、kaggleのコンペに提出する。 submission.to_csv('submission.csv',index=False)
【kaggle】タイタニックのコンペ(6)
Kaggleで定番のタイタニック号の生存者の分析をPythonで行う記録。
↓コンペのサイトはここです。
Titanic: Machine Learning from Disaster | Kaggle
Pythonによる分析の一例をManav Sehgalさんのカーネルを参考に(と言いうかこれに沿って)行います。
↓Manav Sehgalさんの分析手順はここで確認ができます。
Titanic Data Science Solutions | Kaggle
17.4.数字の連続データを補完する。
・欠損値やNull値がある属性を推測する。まずは年齢のNull値を推測する。
・推測手法を3つ試みる。
・推測手法1:平均と標準偏差に従う乱数を発生させる。
・推測手法2:他の属性との相関から予測する。
・推測手法3:推測手法1と2の組み合わせ。等級と性別ごとの平均と標準偏差について、乱数を発生させる。
・推測手法1と3は乱数を使うため、値が安定しないので、今回は推測手法2を採用する。
#性別の2値(Sex:0,1)と等級の3値(Pclass:1,2,3)の組み合わせによる年齢を推測する。 guess_ages=np.zeros((2,3)) for dataset in combine: for i in range(0,2): for j in range(0,3): guess_df=dataset[(dataset['Sex']==i)&\ (dataset['Pclass']==j+1)]['Age'].dropna() age_guess=guess_df.median() guess_ages[i,j]=int(age_guess/0.5+0.5)*0.5 for i in range(0,2): for j in range(0,3): dataset.loc[(dataset.Age.isnull())&\ (dataset.Sex==i)&\ (dataset.Pclass==j+1),'Age']=guess_ages[i,j] dataset['Age']=dataset['Age'].astype(int) train_df[train_df.Age.isnull()] '''出力 Survived Pclass Sex Age SibSp Parch Fare Embarked Title →AgeのNull値が無いことが確認できた。 '''
・Ageを5つのグループに分ける。
train_df['AgeBand']=pd.cut(train_df['Age'],5) train_df[['AgeBand','Survived']].groupby(['AgeBand'],as_index=False).\ mean().sort_values(by='AgeBand',ascending=True) '''出力 AgeBand Survived 0 (-0.08, 16.0] 0.550000 1 (16.0, 32.0] 0.337374 2 (32.0, 48.0] 0.412037 3 (48.0, 64.0] 0.434783 4 (64.0, 80.0] 0.090909 '''
・Ageの5つのグループに序数を与える。
for dataset in combine: dataset.loc[ dataset['Age'] <= 16, 'Age_category'] = 0 dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age_category'] = 1 dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age_category'] = 2 dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age_category'] = 3 dataset.loc[ dataset['Age'] > 64, 'Age_category']=4
17.5.既存の属性データから新しい属性データを作成する。
・SibSp(兄弟、配偶者の数)とParch(両親、子供の数)を基にFamilySize(家族の数)の属性を作成する。
for dataset in combine: dataset['FamilySize']=dataset['SibSp']+dataset['Parch']+1 train_df[['FamilySize','Survived']].\ groupby(['FamilySize'],as_index=False).\ mean().sort_values(by='Survived',ascending=False) '''出力 FamilySize Survived 3 4 0.724138 2 3 0.578431 1 2 0.552795 6 7 0.333333 0 1 0.303538 4 5 0.200000 5 6 0.136364 7 8 0.000000 8 11 0.000000 '''
・IsAlone(独り身)の属性も作成する。
for dataset in combine: dataset['IsAlone']=0 dataset.loc[dataset['FamilySize']==1,'IsAlone']=1 train_df[['IsAlone','Survived']].groupby(['IsAlone'],as_index=False).mean() '''出力 IsAlone Survived 0 0 0.505650 1 1 0.303538 '''
・年齢と等級を組み合わせた人工的な属性を作成する。
for dataset in combine: dataset['Age*Class']=dataset.Age_category*dataset.Pclass train_df.loc[:,['Age*Class','Age_category','Pclass']].head(10) '''出力 Age*Class Age_category Pclass 0 3.0 1.0 3 1 2.0 2.0 1 2 3.0 1.0 3 3 2.0 2.0 1 4 6.0 2.0 3 5 3.0 1.0 3 6 3.0 3.0 1 7 0.0 0.0 3 8 3.0 1.0 3 9 0.0 0.0 2 '''
17.6.カテゴリカルデータを補完する。
・トレーニングデータのうち、Embarked(乗船した港)の属性が抜けているデータが2つある。
・最も一般的な値(mode)で埋める。
freq_port=train_df.Embarked.dropna().mode()[0] freq_port #出力:S for dataset in combine: dataset['Embarked']=dataset['Embarked'].fillna(freq_port) train_df[['Embarked','Survived']].groupby(['Embarked'], as_index=False).\ mean().sort_values(by='Survived',ascending=False) '''出力 Embarked Survived 0 C 0.553571 1 Q 0.389610 2 S 0.339009 '''
17.6.カテゴリカルデータを数値に変換する。
・Embarked(乗船した港)の属性の値を数値に変換する。
for dataset in combine: dataset['Embarked']=dataset['Embarked'].map({'S':0,'C':1,'Q':2}).astype(int)
17.7 残りの数値属性の補完と変換を行う。
・Fare属性の値が一つ抜けているのでそれを中央値で補完する。
test_df['Fare'].fillna(test_df['Fare'].dropna().median(),inplace=True)
・Fareの範囲をpd.qcutで4つに分ける。
train_df['FareBand']=pd.qcut(train_df['Fare'],4) train_df[['FareBand','Survived']].groupby(['FareBand'],as_index=False).\ mean().sort_values(by='FareBand',ascending=True) '''出力 FareBand Survived 0 (-0.001, 7.91] 0.197309 1 (7.91, 14.454] 0.303571 2 (14.454, 31.0] 0.454955 3 (31.0, 512.329] 0.581081 '''
・Fareを順序尺度に変換する。
for dataset in combine: dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0 dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1 dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare'] = 2 dataset.loc[ dataset['Fare'] > 31, 'Fare'] = 3 dataset['Fare'] = dataset['Fare'].astype(int) train_df = train_df.drop(['FareBand'], axis=1) combine = [train_df, test_df]
【備忘録】ax = ax or plt.gca()の記載の意味とPythonにおけるorの挙動
・以下の関数のax = ax or plt.gca()はaxの指定があればそれを適用し、指定が無ければmatplotlibによって作成するという意味。
def plot_something(data, ax=None, **kwargs): ax = ax or plt.gca() # Do some cool data transformations... return ax.boxplot(data, **kwargs)
引用元(ax = ax or plt.gca())
stackoverflow.com
・Pythonにおける x or yの挙動は以下の通り。したがって、上記の関数では、ax=ax or plt.gca()が意図した通りに挙動する。
if bool(x): # xの論理値がTrueなら return x # yを見ることなく、しかもTrueではなくxそのものをリターン else: # xの論理値がFalseなら return y # bool(y) ではなく、yそのものをリターン
【備忘録】WindowsでIPアドレスを確認する方法
・コマンドプロンプトで「ipconfig」と入力して[Enter]キーを押す。
・表示されたIPv4アドレスまたはIPアドレス(IP Address)を確認する。
引用元↓
www.aterm.jp
【備忘録】matplotlibのaxes.flat や ax.flatの意味
axes.flat は関数ではなく、numpy.ndarrayの属性であり、numpy.ndarray.flatという意味。
numpy.ndarray.flatは配列(array)のイテレータになる。
詳しくはここ↓
stackoverflow.com