Etiket: #Yapayzeka

  • Dosya Okuma ve Yazma (Python Dersi 14)

    Dosya Okuma ve Yazma (Python Dersi 14)

    Şimdiye kadar yazdığımız her programda bir sorun vardı: Program kapanınca her şey unutuluyordu. Sayı tahmin oyununda en iyi skorunu, alışveriş listende yazdığın ürünleri, hesapladığın notları… Hepsi değişkenlerde duruyordu ve değişkenler program bitince kaybolur.

    Bir şeyi kalıcı olarak saklamanın en basit yolu onu bir dosyaya yazmak. Bu derste dosya açmayı, yazmayı, okumayı ve veri analizinde en sık göreceğin CSV dosyalarını öğreniyoruz. Sonunda da kapatıp açınca bile unutmayan bir alışveriş listesi yazıyoruz.

    Tüm kodlar Colab’da, tek tıkla açılıyor: Colab’da aç

    Colab’da oluşturduğun dosyaları sol taraftaki klasör simgesine tıklayarak görebilirsin. Ama dikkat: Colab oturumu kapanınca bu dosyalar da silinir. Kalıcı saklamak istediğin bir dosyayı bilgisayarına indirmen gerekir.

    İlk dosyamızı yazalım

    open() fonksiyonu bir dosyayı açar. Ona iki şey söylüyoruz: dosyanın adı ve ne yapacağımız.

    dosya = open("notlar.txt", "w", encoding="utf-8")
    dosya.write("Bugün dosyalara giriş yaptım.\n")
    dosya.write("Şimdi ne öğrendiğimi okuyacağım.\n")
    dosya.close()
    print("Dosya yazıldı.")

    Satır satır ne oluyor:

    • "w": yazmak için aç (write). Dosya yoksa oluşturulur.
    • encoding="utf-8": ç, ğ, ı, ö, ş, ü gibi Türkçe karakterlerin doğru kaydedilmesi için. Bunu her dosya işleminde yazmayı alışkanlık hâline getir.
    • \n: satır sonu. Yazmazsan iki cümle aynı satıra yapışır.
    • close(): dosyayı kapat. Unutursan yazdıkların dosyaya tam kaydedilmeyebilir.

    with: kapatmayı Python’a bırak

    close() yazmayı unutmak çok kolay. with bloğu bu yükten kurtarıyor: Blok bitince dosya kendiliğinden kapanır. Bundan sonra hep bu yolu kullanacağız.

    with open("notlar.txt", "r", encoding="utf-8") as dosya:
    icerik = dosya.read()
    print(icerik)
    Bugün dosyalara giriş yaptım.
    Şimdi ne öğrendiğimi okuyacağım.

    "r" okumak (read) demek. read() dosyanın tamamını tek bir metin olarak getirir.

    Üç temel mod: r, w, a

    ModAnlamıDosya yoksaDosya varsa
    "r"okuhata verirbaştan okur
    "w"yazoluştururiçini siler, baştan yazar
    "a"ekleoluşturursonuna ekler

    En sık yapılan hata: Var olan bir dosyaya bir şey eklemek isterken "w" kullanmak. "w" dosyanın içini sorgusuz sualsiz siler. Eski içeriği korumak istiyorsan "a" (append) kullan:

    with open("notlar.txt", "a", encoding="utf-8") as dosya:
    dosya.write("Bu satır sonradan eklendi.\n")

    Satır satır okumak

    Dosyayı bir for döngüsüne verirsen her turda bir satır gelir:

    with open("notlar.txt", "r", encoding="utf-8") as dosya:
    for numara, satir in enumerate(dosya, start=1):
    print(numara, satir.strip())
    1 Bugün dosyalara giriş yaptım.
    2 Şimdi ne öğrendiğimi okuyacağım.
    3 Bu satır sonradan eklendi.

    Her satırın sonunda bir \n karışıyor. strip() onu atıyor; yoksa satırların arasında boş satırlar görürsün. enumerate ise satırları numaralandırmamızı sağlıyor.

    Tüm satırları bir listeye almak istersen:

    with open("notlar.txt", "r", encoding="utf-8") as dosya:
    satirlar = dosya.read().splitlines()
    print(len(satirlar)) # 3

    Sayıları yazmak: önce metne çevir

    write() sadece metin kabul eder. Bir sayıyı yazmadan önce str() ile metne çevirmen, okurken de int() ile geri sayıya çevirmen gerekir:

    puanlar = [85, 92, 78]
    with open("puanlar.txt", "w", encoding="utf-8") as dosya:
    for puan in puanlar:
    dosya.write(str(puan) + "\n")
    with open("puanlar.txt", "r", encoding="utf-8") as dosya:
    okunan = [int(satir) for satir in dosya]
    print(okunan) # [85, 92, 78]
    print(sum(okunan) / len(okunan)) # 85.0

    Okuma kısmındaki tek satırlık döngü, Ders 12’de öğrendiğimiz liste üreteci.

    Devamını oku: Kümeler ve Liste Üreteçleri (Python Dersi 12)

    Dosya yoksa ne olur?

    Olmayan bir dosyayı "r" ile açmaya çalışırsan Python FileNotFoundError verir ve program durur. Geçen derste öğrendiğimiz try ve except tam burada işe yarıyor:

    try:
    with open("olmayan_dosya.txt", "r", encoding="utf-8") as dosya:
    print(dosya.read())
    except FileNotFoundError:
    print("Böyle bir dosya yok. Önce oluşturman gerekiyor.")

    Devamını oku: Hata Yönetimi: try ve except (Python Dersi 13)

    CSV dosyaları

    Veri analizine geçtiğinde en sık göreceğin dosya türü CSV olacak. Her satır bir kayıt, değerler virgülle ayrılmış. Aslında düz bir metin dosyası, Excel’de de açılabiliyor. Python’un hazır csv modülü bu işi kolaylaştırıyor:

    import csv
    ogrenciler = [
    ["ad", "bolum", "not"],
    ["Ayşe", "Bilgisayar", 88],
    ["Mehmet", "Endüstri", 74],
    ["Zeynep", "Bilgisayar", 95],
    ]
    with open("ogrenciler.csv", "w", encoding="utf-8", newline="") as dosya:
    yazici = csv.writer(dosya)
    yazici.writerows(ogrenciler)

    newline="" bazı sistemlerde satırlar arasında fazladan boş satır oluşmasını engelliyor. CSV yazarken eklemeyi unutma.

    Okurken csv.DictReader her satırı bir sözlüğe çeviriyor, böylece sütunlara adıyla ulaşabiliyorsun:

    with open("ogrenciler.csv", "r", encoding="utf-8") as dosya:
    for satir in csv.DictReader(dosya):
    print(satir["ad"], "->", satir["not"])
    Ayşe -> 88
    Mehmet -> 74
    Zeynep -> 95

    Dikkat: CSV’den okunan her şey metin olarak gelir. satir["not"] bir sayı değil, "88" gibi bir metin. Hesap yapacaksan int() ile çevirmen gerekiyor.

    Gerçek bir veri projesinde CSV’leri genelde pandas kütüphanesiyle okuyoruz, ama arka planda olan şey tam olarak bu.

    Devamını oku: Futbol Veri Projesi 1: Maç Verisini Toplamak ve Temizlemek

    Mini proje: unutmayan alışveriş listesi

    Öğrendiklerimizi birleştirelim. Program her açıldığında listeyi dosyadan yüklesin, yeni ürün eklenince dosyaya kaydetsin:

    LISTE_DOSYASI = "alisveris.txt"
    def listeyi_yukle():
    try:
    with open(LISTE_DOSYASI, "r", encoding="utf-8") as dosya:
    return dosya.read().splitlines()
    except FileNotFoundError:
    return []
    def urun_ekle(urun):
    with open(LISTE_DOSYASI, "a", encoding="utf-8") as dosya:
    dosya.write(urun + "\n")
    def listeyi_goster():
    liste = listeyi_yukle()
    if not liste:
    print("Liste boş.")
    for sira, urun in enumerate(liste, start=1):
    print(f"{sira}. {urun}")
    listeyi_goster()
    urun_ekle("süt")
    urun_ekle("ekmek")
    urun_ekle("domates")
    print("---")
    listeyi_goster()
    Liste boş.
    ---
    1. süt
    2. ekmek
    3. domates

    Burada üç dersin bir araya geldiğini görüyorsun: fonksiyonlar (Ders 9), hata yönetimi (Ders 13) ve dosyalar. Dosya henüz yoksa listeyi_yukle() programı çökertmek yerine boş bir liste döndürüyor.

    Colab’da son hücreyi bir kez daha çalıştır: Ürünler iki kez eklenir. Çünkü liste artık programın içinde değil, dosyada duruyor. Programı kapatıp açsan da kaybolmuyor. Bu dersin bütün meselesi de bu.

    Alıştırmalar

    1. gunluk.txt adında bir dosya oluştur ve içine üç satır yaz. Sonra dosyayı okuyup kaç satır olduğunu ekrana yazdır.
    2. puanlar.txt dosyasına içini silmeden iki yeni puan ekle. Sonra en yüksek puanı bul.
    3. ogrenciler.csv dosyasını DictReader ile oku ve sadece Bilgisayar bölümündeki öğrencilerin not ortalamasını hesapla.
    4. Alışveriş listesine urun_sil(urun) fonksiyonu ekle. İpucu: Listeyi yükle, ürünü çıkar, kalanları "w" ile baştan yaz.

    Cevaplar not defterinin sonunda.

    Bu derste neler öğrendik?

    • open(dosya, mod, encoding="utf-8") bir dosyayı açar.
    • with bloğu dosyayı kendiliğinden kapatır.
    • "r" okur, "w" silip yazar, "a" sonuna ekler.
    • Dosyayı for ile gezersen satır satır okursun; strip() satır sonunu temizler.
    • write() sadece metin alır: Sayıları str() ile çevir.
    • Olmayan dosya FileNotFoundError verir; try ve except ile yakala.
    • CSV için csv.writer ve csv.DictReader kullan, okunan değerlerin metin olduğunu unutma.

    Sıradaki ders

    Bir sonraki derste Python’un gücünün asıl kaynağına geliyoruz: başkalarının yazdığı hazır kodları kullanmak. Bu derste import csv diyerek küçük bir tadımını aldık.

    Sıradaki ders: Modüller ve pip: Hazır Kütüphaneleri Kullanmak (Python Dersi 15)

  • Hata Yönetimi: try ve except (Python Dersi 13)

    Hata Yönetimi: try ve except (Python Dersi 13)

    Bu seride şimdiye kadar birçok hata gördük: ValueError, KeyError, TypeError… Her seferinde program olduğu yerde durdu ve kırmızı bir mesaj yazdı. Gerçek bir uygulamada bu kabul edilemez. Kullanıcı yanlış bir şey yazdı diye bir banka uygulamasının kapandığını düşün.

    Bu derste hataları yakalamayı, onlara anlaşılır bir cevap vermeyi ve gerektiğinde kendi hatamızı oluşturmayı öğreniyoruz.

    Kodların hepsi Colab’da hazır: Colab’da Aç

    Hatalar programı durdurur

    sayi = int("abc")
    print("Bu satır hiç çalışmaz.")
    # ValueError: invalid literal for int() with base 10: 'abc'

    Python’da bu tür hatalara istisna (exception) deniyor. Bir istisna oluştuğunda Python o anda yaptığı işi bırakıyor. Biz bir şey söylemedikçe de programı tamamen durduruyor.

    try ve except

    try:
    sayi = int("abc")
    print("Bu satır çalışmaz.")
    except ValueError:
    print("Bu bir sayı değil.")
    print("Program devam ediyor.")
    Bu bir sayı değil.
    Program devam ediyor.

    Okunuşu basit: “Şunu dene. Eğer ValueError olursa, onun yerine şunu yap.” try bloğunun içinde hata çıktığı anda geri kalan satırlar atlanıyor ve doğrudan except bloğuna geçiliyor. Sonra program kaldığı yerden devam ediyor.

    Farklı hatalar, farklı cevaplar

    Bir try bloğunun altına birden fazla except yazabilirsin. Her hata türüne ayrı bir cevap veriyorsun:

    def bol(a, b):
    try:
    sonuc = int(a) / int(b)
    except ValueError:
    return "Lütfen sayı gir."
    except ZeroDivisionError:
    return "Sıfıra bölünemez."
    return sonuc
    print(bol("10", "2")) # 5.0
    print(bol("on", "2")) # Lütfen sayı gir.
    print(bol("10", "0")) # Sıfıra bölünemez.

    En sık karşılaşacağın hatalar:

    HataNe zaman olur?Örnek
    ValueErrorDeğerin türü doğru ama içeriği uygun değilint("abc")
    TypeErrorİşlem bu türle yapılamıyor"5" + 3
    ZeroDivisionErrorSıfıra bölme10 / 0
    KeyErrorSözlükte olmayan anahtarnotlar["Zeynep"]
    IndexErrorListede olmayan sıra[1, 2, 3][10]
    FileNotFoundErrorAçılmak istenen dosya yokDers 14’te göreceğiz

    Hata mesajını yakalamak: as

    Hatanın ayrıntısını da kullanmak istersen as ile bir değişkene alabilirsin:

    notlar = {"Ayşe": 85, "Mert": 45}
    try:
    print(notlar["Zeynep"])
    except KeyError as hata:
    print("Bulunamayan anahtar:", hata)
    # Bulunamayan anahtar: 'Zeynep'

    Kod Kartı #06’da aynı durumu get() ile çözmüştük. İkisi de doğru; get kısa bir varsayılan değer için, try ise hata durumunda daha fazla şey yapman gerektiğinde daha uygun.

    else ve finally

    try bloğuna iki parça daha eklenebiliyor:

    def oku(metin):
    try:
    sayi = int(metin)
    except ValueError:
    print(f"{metin!r} sayıya çevrilemedi.")
    else:
    print(f"Başarılı: {sayi}")
    finally:
    print("Kontrol bitti.")
    oku("42")
    oku("kırk iki")
    Başarılı: 42
    Kontrol bitti.
    'kırk iki' sayıya çevrilemedi.
    Kontrol bitti.
    • else: Hiç hata olmazsa çalışır.
    • finally: Her durumda çalışır, hata olsa da olmasa da. Bir dosyayı kapatmak ya da bir bağlantıyı sonlandırmak gibi “ne olursa olsun yapılmalı” işler için kullanılır.

    {metin!r} ifadesi metni tırnaklarıyla yazdırıyor; boşluklu ya da boş bir girişi fark etmeyi kolaylaştırıyor.

    Kendi hatanı fırlatmak: raise

    Bazen Python için her şey doğru görünür ama senin programın için değildir. Mesela eksi bir yaş. Böyle durumlarda hatayı kendin oluşturabilirsin:

    def yas_kaydet(yas):
    if yas < 0:
    raise ValueError("Yaş negatif olamaz.")
    return f"Yaş kaydedildi: {yas}"
    try:
    yas_kaydet(-3)
    except ValueError as hata:
    print("Hata:", hata)
    # Hata: Yaş negatif olamaz.

    raise ile fırlatılan bir hata, Python’un kendi hataları gibi davranıyor: Yakalanmazsa programı durduruyor, yakalanırsa except bloğuna gidiyor.

    Kötü bir alışkanlık: her hatayı susturmak

    except yanına hata türü yazmazsan her hatayı yakalar. İlk bakışta pratik görünüyor ama tehlikeli:

    # Bunu yapma
    def ortalama_kotu(notlar):
    try:
    return sum(notlar) / len(notlar)
    except:
    return 0
    print(ortalama_kotu([])) # 0
    print(ortalama_kotu("doksan")) # 0

    Boş liste için 0 dönmesi belki kabul edilebilir. Ama ikinci satırda yanlış türde bir veri gönderdik ve fonksiyon bunu sessizce 0’a çevirdi. Gerçek bir programda bu tür hataları bulmak günler sürebilir. Kural: Sadece beklediğin ve ne yapacağını bildiğin hatayı yakala.

    # Bunu yap
    def ortalama(notlar):
    try:
    return sum(notlar) / len(notlar)
    except ZeroDivisionError:
    return None

    Bu sürüm boş listeyi yakalıyor, yanlış türde veri gelirse ise hatayı görmeni sağlıyor.

    Mini program: güvenli not girişi

    Ders 10’daki sayı tahmin oyununda kullanıcı girişini isdigit() ile kontrol etmiştik. Bu yöntem eksi sayıları ve ondalıklı sayıları da “rakam değil” diye reddediyordu. try ile daha sağlam bir sürüm yazalım:

    def not_iste(mesaj):
    """0 ile 100 arasında bir not alana kadar sorar."""
    while True:
    cevap = input(mesaj)
    try:
    puan = float(cevap.replace(",", "."))
    except ValueError:
    print("Lütfen bir sayı yaz.")
    continue
    if 0 <= puan <= 100:
    return puan
    print("Not 0 ile 100 arasında olmalı.")
    notlar = [not_iste(f"{i}. not: ") for i in range(1, 4)]
    print("Ortalama:", round(sum(notlar) / len(notlar), 1))
    1. not: doksan
    Lütfen bir sayı yaz.
    1. not: -5
    Not 0 ile 100 arasında olmalı.
    1. not: 85
    2. not: 70,5
    3. not: 101
    Not 0 ile 100 arasında olmalı.
    3. not: 90
    Ortalama: 81.8

    replace(",", ".") satırına dikkat: Türkiye’de ondalık sayıları virgülle yazıyoruz, Python ise nokta bekliyor. Kullanıcı “70,5” yazdığında virgülü noktaya çevirip öyle deniyoruz. Ders 11’deki Türkçe I/İ tuzağı gibi, bu da Türkçe kullanıcılar için yazılan programların küçük ama önemli bir detayı.

    Son satırdaki liste üreteci de Ders 12’den: not_iste fonksiyonunu üç kez çağırıp sonuçları bir listeye topluyor.

    Alıştırmalar

    1. Kullanıcıdan iki sayı alıp birinciyi ikinciye bölen bir program yaz. Sayı olmayan girişte ve sıfıra bölmede anlaşılır bir mesaj ver.
    2. ["10", "yirmi", "30", "", "40"] listesindeki metinleri tam sayıya çevir; çevrilemeyenleri atla ve kaç tanesinin atlandığını yazdır.
    3. Bir sözlükte anahtarı arayan bul(sozluk, anahtar) fonksiyonunu get kullanmadan, try ve except KeyError ile yaz.
    4. sifre_kontrol(sifre) fonksiyonu yaz: Şifre 8 karakterden kısaysa ValueError fırlatsın. Fonksiyonu bir kısa bir uzun şifreyle dene.

    Cevaplar Colab not defterinin sonunda.

    Bu derste ne öğrendik?

    • Bir istisna oluştuğunda Python programı durdurur; try ve except ile bunu yakalarız.
    • Farklı hata türleri için ayrı except blokları yazılabilir; as ile hata mesajına ulaşılır.
    • else hata olmazsa, finally her durumda çalışır.
    • raise ile kendi hatamızı fırlatabiliriz.
    • Sadece beklediğin hatayı yakala; türsüz except hataları saklar.

    Sıradaki ders

    Python Dersi 14’te dosya okumayı ve yazmayı öğreniyoruz. Bu derste öğrendiğin try ve except, olmayan bir dosyayı açmaya çalıştığında hemen işine yarayacak.

    Devamını oku

  • R ve RStudio Kurulumu (R Dersi 2)

    R ve RStudio Kurulumu (R Dersi 2)

    R Dersi 1’de R’ın ne olduğunu ve Python’dan nerede ayrıldığını konuştuk. Bu derste R’ı kendi bilgisayarına kuruyoruz. Aslında iki şey kuracağız: R ve RStudio. Baştan bu farkı anlamak, kurulumda karşılaşılan sorunların çoğunu önlüyor.

    R ile RStudio aynı şey değil

    • R dilin kendisi. Yazdığın kodu anlayıp çalıştıran program bu.
    • RStudio R’la çalışmayı kolaylaştıran bir geliştirme ortamı. Kod yazdığın editörü, grafiklerin göründüğü paneli, değişkenlerinin listesini bir arada sunuyor.

    Bir araba benzetmesi: R motor, RStudio da direksiyonu, göstergeleri ve koltuğuyla arabanın içi. Motor olmadan araba gitmez; iç olmadan da motoru kullanmak çok zor. Bu yüzden sıra önemli: önce R, sonra RStudio.

    Python derslerinde benzer bir ayrım vardı: Python dilin kendisi, Colab ise onu kullandığımız ortamdı.

    Bu seride biz ne kullanacağız? Python derslerinde olduğu gibi R derslerinde de Google Colab‘la devam edeceğiz. Yani bu serideki kodları çalıştırmak için bilgisayarına hiçbir şey kurman gerekmiyor. Yine de R’la ileride ciddi çalışmak, tez ya da proje yapmak isteyenler için kurulumu da adım adım anlatıyorum. Kurulumu şimdilik atlamak istiyorsan doğrudan “Bizim sistemimiz: R’ı Colab’da kullanmak” bölümüne geçebilirsin.

    1. Adım: R’ı kur

    R, CRAN (Comprehensive R Archive Network) üzerinden ücretsiz dağıtılıyor: cloud.r-project.org

    Windows

    1. cloud.r-project.org adresine git ve “Download R for Windows” bağlantısına tıkla.
    2. “base” bağlantısına tıkla, sonra en üstteki “Download R-4.x.x for Windows” bağlantısından kurulum dosyasını indir. Numara güncel sürüme göre değişir.
    3. Dosyayı çalıştır ve varsayılan ayarlarla “İleri” diyerek kurulumu bitir.

    Aynı sayfada göreceğin Rtools‘a şimdilik ihtiyacın yok. Rtools bazı paketleri kaynak koddan derlemek için gerekiyor; yeni başlarken kullandığın paketlerin neredeyse hepsi hazır derlenmiş geliyor.

    macOS

    1. cloud.r-project.org adresine git ve “Download R for macOS” bağlantısına tıkla.
    2. Mac’inin işlemcisine uygun dosyayı seç: Apple Silicon (M1, M2, M3 ve sonrası) için “arm64”, Intel işlemcili Mac’ler için “x86_64” yazan dosya. Hangisi olduğunu sol üstteki elma menüsünden “Bu Mac Hakkında” bölümünde görebilirsin.
    3. İndirdiğin .pkg dosyasını aç ve kurulumu tamamla.

    Kurulumu kontrol et

    R’ı açtığında sade bir konsol penceresi göreceksin. > işaretinin yanına şunu yaz ve Enter’a bas:

    1 + 1

    [1] 2 yazıyorsa R çalışıyor. Bu pencereyi kapatabilirsin; bundan sonra R’ı RStudio’nun içinden kullanacağız.

    2. Adım: RStudio’yu kur

    RStudio’yu Posit firması geliştiriyor. Ücretsiz ve açık kaynaklı sürümün adı RStudio Desktop. “Pro” yazan sürüm şirketler için olan ücretli sürüm; ona ihtiyacın yok.

    1. posit.co adresinde RStudio Desktop’ın indirme sayfasını aç.
    2. Sayfa işletim sistemini genelde kendisi tanır ve uygun dosyayı önerir. Windows için .exe, macOS için .dmg dosyasını indir.
    3. Windows’ta .exe dosyasını çalıştır. macOS’ta .dmg dosyasını aç ve RStudio simgesini Uygulamalar klasörüne sürükle.
    4. RStudio’yu aç. Bilgisayarındaki R’ı kendisi bulacak.

    Posit’in güncel indirme sayfasına göre RStudio Desktop; Windows 11, macOS 15 ve sonrası ile yaygın Linux dağıtımlarında çalışıyor. Daha eski bir sistem kullanıyorsan aşağıdaki kurulumsuz seçeneklere bak.

    RStudio’yu tanı: dört panel

    RStudio’yu ilk açtığında ekran dört bölüme ayrılıyor. İlk açılışta sol üstteki panel görünmeyebilir; yeni bir dosya açınca ortaya çıkıyor.

    PanelYeriNe işe yarar?
    Source (Kaynak)Sol üstKodunu yazdığın ve kaydettiğin dosyalar
    Console (Konsol)Sol altKodun çalıştığı ve sonuçların yazıldığı yer
    Environment (Ortam)Sağ üstOluşturduğun değişkenlerin ve tabloların listesi
    Files, Plots, Packages, HelpSağ altDosyalar, grafikler, kurulu paketler ve yardım sayfaları

    Konsola yazdığın kod hemen çalışır ama kaydedilmez. Saklamak istediğin her şeyi Source panelinde bir dosyaya yaz.

    İlk R dosyan

    1. Üst menüden File > New File > R Script seç. Sol üstte boş bir dosya açılacak.
    2. Şu satırları yaz:
    # Benim ilk R dosyam
    notlar <- c(70, 85, 40, 90, 45)
    mean(notlar)
    hist(notlar, main = "Not dağılımı", col = "steelblue")
    1. İmleci ilk satırlardan birine getir ve Ctrl + Enter (Mac’te Cmd + Enter) bas. O satır konsolda çalışır. Satır satır ilerle.
    2. Son satırı çalıştırınca sağ alttaki Plots panelinde notların dağılımını gösteren bir grafik belirecek. Sağ üstteki Environment panelinde de notlar değişkenini göreceksin.
    3. Ctrl + S (Mac’te Cmd + S) ile dosyayı kaydet. R dosyalarının uzantısı .R.

    Dosyanın tamamını tek seferde çalıştırmak için Source panelinin sağ üstündeki Source düğmesini kullanabilirsin.

    Paket kurmak

    R’ın gücünün büyük kısmı paketlerden geliyor. Bir paketi bilgisayarına bir kez kuruyorsun, her yeni oturumda da yüklüyorsun:

    install.packages("ggplot2") # bir kez: paketi indirip kurar
    library(ggplot2) # her oturumda: paketi kullanıma açar

    install.packages içinde paket adı tırnak içinde, library içinde tırnaksız yazılıyor. ggplot2’yu ilerideki derslerde grafik çizmek için kullanacağız. Python’daki pip install ve import ikilisinin R’daki karşılığı bu; Python tarafını Ders 15’te anlatacağım.

    Bir fonksiyonun ne yaptığını merak edersen başına soru işareti koy:

    ?mean

    Yardım sayfası sağ alttaki Help panelinde açılır.

    İyi bir alışkanlık: RStudio projesi

    Her ders ya da çalışma için ayrı bir proje açmak, dosyalarını düzenli tutmanın en kolay yolu:

    1. File > New Project > New Directory > New Project seç.
    2. Proje adını yaz (örneğin r-dersleri) ve klasörün yerini seç.

    RStudio bu klasörü çalışma dizini yapar. Bir veri dosyasını proje klasörüne koyduğunda, dosyayı uzun bir yol yazmadan sadece adıyla okuyabilirsin.

    Bizim sistemimiz: R’ı Colab’da kullanmak

    Bu serinin bütün kodlarını Python derslerinde kullandığımız Google Colab’da çalıştıracağız. Colab’ı Python Dersi 2’den tanıyorsun; R için tek fark çalışma zamanını değiştirmek.

    1. colab.research.google.com adresine git ve Google hesabınla giriş yap.
    2. Dosya > Yeni not defteri ile boş bir not defteri aç.
    3. Üst menüden Çalışma zamanı > Çalışma zamanı türünü değiştir seç.
    4. Açılan pencerede dil olarak R‘ı seç ve kaydet.
    5. İlk hücreye R.version.string yaz ve Shift + Enter ile çalıştır. Çıktıda R’ın sürümünü görüyorsan hazırsın.

    Yukarıdaki “İlk R dosyan” bölümündeki kodu da aynı şekilde bir hücreye yapıştırıp çalıştırabilirsin; grafik hücrenin hemen altında görünür.

    Colab’da çalışırken bilmen gereken üç şey:

    • Kopyanı kaydet. Python derslerindeki gibi, çalışmanı saklamak için Dosya > Drive’da kopya kaydet seç.
    • Paketler kalıcı değil. Colab her yeni oturumda temiz bir makineyle başlıyor. install.packages ile kurduğun bir paketi ertesi gün yeniden kurman gerekebilir. Bu yüzden paket kuran satırları not defterinin en üstündeki hücrede tut.
    • Dosyalar kalıcı değil. Sol taraftaki dosya panelinden yüklediğin bir veri dosyası da oturum kapanınca siliniyor. Kalıcı olması gereken dosyaları Google Drive’ında tut.

    Colab dışında kurulum gerektirmeyen bir seçenek daha var: Posit Cloud, RStudio’nun tarayıcıda çalışan sürümü. RStudio’nun dört panelli görünümünü kurulum yapmadan denemek istersen oraya da bakabilirsin. Bu serideki kodların hepsi Colab’da, RStudio’da ve Posit Cloud’da aynı şekilde çalışıyor.

    Sık karşılaşılan sorunlar

    • “RStudio R’ı bulamıyor” uyarısı: Büyük ihtimalle R kurulmadan RStudio kuruldu. R’ı kur ve RStudio’yu yeniden başlat.
    • Paket kurulurken “Would you like to use a personal library?” sorusu: “Yes” de. Paket, bilgisayarın sistem klasörü yerine senin kullanıcı klasörüne kurulur; bu normal.
    • Windows’ta kullanıcı adında Türkçe karakter: Kullanıcı klasörünün adında ş, ı, ö gibi harfler varsa bazı paketlerin kurulumunda sorun çıkabiliyor. Başına gelirse bir proje klasörünü Türkçe karakter içermeyen bir yola (örneğin C:\r-dersleri) açmak iyi bir ilk adım.
    • Hangi sürümü kurduğunu görmek: Konsola R.version.string yaz.

    Bu derste ne öğrendik?

    • R dilin kendisi, RStudio onu kullandığımız ortam. Önce R, sonra RStudio kurulur.
    • R, CRAN’dan; RStudio Desktop, Posit’in sitesinden ücretsiz indirilir.
    • RStudio’da dört panel var: kaynak, konsol, ortam ve dosyalar/grafikler/yardım.
    • Ctrl + Enter (Mac’te Cmd + Enter) bulunduğun satırı çalıştırır.
    • Paketler bir kez install.packages ile kurulur, her oturumda library ile yüklenir.
    • Bu seride kodları Google Colab’ın R çalışma zamanında çalıştıracağız; kurulum isteyene kaldı.

    Sıradaki ders

    R Dersi 3’te R’da değişkenleri ve veri tiplerini öğreniyoruz. Python Dersi 3’ü okuduysan birçok şey tanıdık gelecek.

    Devamını oku

  • Kamu Bankalarında BT Uzman Yardımcılığı Sınavında Ne Sorulur?

    Kamu Bankalarında BT Uzman Yardımcılığı Sınavında Ne Sorulur?

    Bilgisayar, yazılım ya da elektrik-elektronik okuyan birçok kişinin listesinde kamu bankalarının bilgi teknolojileri (BT) kadroları var. Bu kadrolara giden yol KPSS’den farklı: Bankalar alımları genelde kendi sınavlarıyla yapıyor ve her ilanın koşulları, konuları birbirinden biraz farklı.

    Bu yazıda Ziraat Bankası, Halkbank ve VakıfBank’ın son yıllardaki ilanlarını inceleyip ortak noktaları bir araya getirdim: kimler başvurabiliyor, sınav nasıl işliyor, yazılıda hangi konular çıkıyor ve nasıl çalışılabilir.

    Önemli: Bu yazı genel bir rehber. Bilgiler 5 Kasım 2026’da kontrol edilen geçmiş ilanlara dayanıyor. Bir sınava başvurmadan önce mutlaka o dönemin resmî ilanını oku; koşullar her ilanda değişebiliyor.

    BT kadroları hangi adlarla açılıyor?

    Bankalar BT alanındaki alımları farklı adlarla duyurabiliyor:

    • BT Uzman Yardımcısı: Halkbank yıllarca bu adla ayrı bir sınav açtı.
    • Uzman Yardımcısı, bilgisayar grubu: Ziraat Bankası’nın 2026 ilanında tek bir uzman yardımcılığı sınavı var, adaylar okuduğu bölüme göre gruplara ayrılıyor. Bunlardan biri “Bilgisayar, Bilişim ve Yapay Zekâ” grubu.
    • BT Müfettiş Yardımcısı ve BT Kontrolör Yardımcısı: Bankanın bilgi sistemlerini denetleyen kadrolar. VakıfBank’ın Eylül 2025 ilanında bu iki unvan vardı. Aynı ilanda bilgi işlem birimlerinin bu alıma dahil olmadığı ayrıca belirtiliyordu. Yani her “BT” unvanı doğrudan yazılım geliştirme işi anlamına gelmiyor; ilanın görev tanımını dikkatle oku.

    Bankaların teknoloji şirketleri de (örneğin Ziraat Teknoloji) kendi ilanlarını ayrıca yayımlıyor.

    Kimler başvurabiliyor?

    İncelenen ilanlardaki ortak koşullar:

    • Bölüm: En az dört yıllık bir lisans programı. Listede genellikle Bilgisayar, Yazılım, Bilişim Sistemleri, Yapay Zekâ, Elektrik-Elektronik, Endüstri mühendislikleri ile Matematik ve İstatistik gibi bölümler yer alıyor. Hangi bölümlerin kabul edildiği ilandan ilana değişiyor; kendi bölümünün adını listede birebir ara.
    • Son sınıf öğrencileri: Birçok ilanda, belirli bir tarihe kadar mezun olmak şartıyla son sınıf öğrencileri de başvurabiliyor.
    • Yaş sınırı: Yaş sınırı doğum tarihiyle veriliyor ve her ilanda güncelleniyor. İncelenen üç ilanda alt sınır 1993, 1995 ve 1996 doğumlulardı.
    • KPSS: İncelenen ilanların hiçbirinde KPSS şartı yoktu; seçim bankanın kendi yazılı sınavı ve mülakatıyla yapılıyordu.
    • İngilizce: YDS ya da YÖKDİL belgesi istenmiyordu. İngilizce, yazılı sınavın içinde ayrı bir bölüm olarak ölçülüyordu.

    Sınav nasıl işliyor?

    Genel akış üç ilanda da benzer:

    1. Başvuru: Başvurular genelde sınavı düzenleyen üniversitenin sitesi üzerinden alınıyor. Bazı ilanlarda sınav ücreti var.
    2. Yazılı sınav: Çoktan seçmeli. İncelenen ilanların bir kısmında sadece doğru cevaplar puanlanıyordu, yani yanlışlar doğruları götürmüyordu.
    3. Barajlar: Her bölümden ayrı ayrı en az puan ya da en az doğru sayısı isteniyor. Toplam puanın yüksek olsa bile bir bölümde barajın altında kalırsan elenebiliyorsun.
    4. Mülakat: Yazılıdan en yüksek puanı alanlar, alınacak kişi sayısının birkaç katı kadar, mülakata çağrılıyor. Bazı ilanlarda kişilik envanteri de var.
    5. Sağlık raporu ve işe başlama: Ziraat’in ilanında işe alınanlar önce Bankacılık Okulu’na katılıyor.

    Yazılı sınavda neler var?

    Üç ilanın yazılı sınav yapısı yan yana:

    Ziraat Bankası 2026 (Bilgisayar grubu)Halkbank 2022 (BT Uzman Yrd.)VakıfBank 2025 (BT Müfettiş/Kontrolör Yrd.)
    Genel kültür ve yetenek20 genel kültür + 40 genel yetenek30 sayısal genel yetenek60 genel yetenek
    İngilizce40 soru30 soru50 soru
    Alan bilgisi40 soru60 soru40 soru
    Toplam140 soru, 160 dakika120 soru, 180 dakika150 soru, 210 dakika

    Görüldüğü gibi alan bilgisi sınavın sadece bir parçası. Genel yetenek ve İngilizce bölümleri birlikte sınavın yarısından fazlasını oluşturabiliyor ve ikisinde de baraj var. Sadece teknik konulara çalışıp İngilizceyi ihmal etmek en yaygın hatalardan biri olabilir.

    Alan bilgisinde hangi konular çıkıyor?

    Üç ilanın konu listelerini birleştirince şu tablo çıkıyor:

    KonuZiraat 2026Halkbank 2022VakıfBank 2025
    Algoritmalar ve veri yapıları✓✓✓
    Veritabanı ve SQL✓✓✓
    Bilgi güvenliği✓✓✓
    Ağlar ve işletim sistemleri✓✓
    Yazılım mühendisliği✓✓
    Programlama dilleri, nesne yönelimli programlama, SOLID✓
    Web ve front-end teknolojileri✓✓
    Veri analitiği, yapay zekâ ve makine öğrenmesi temelleri✓
    Sistem analizi ve dijital teknolojiler✓
    Donanım ve elektronik✓✓

    Tabloda üç ilanda da çıkan üç konu var: algoritmalar ve veri yapıları, veritabanı ve SQL, bilgi güvenliği. Çalışmaya başlayacaksan bu üçünden başla. Ziraat’in 2026 ilanında yapay zekâ ve makine öğrenmesinin konu olarak eklenmesi de dikkat çekici.

    Soru tipleri nasıl olabilir?

    Aşağıdaki sorular gerçek sınav soruları değil; konuların hangi düzeyde sorulabileceğine dair fikir vermek için hazırladığım özgün örnekler.

    1. Veritabanı: Her departmandaki çalışan sayısını bulan bir sorguda, yalnızca beşten fazla çalışanı olan departmanları listelemek için hangi ifade kullanılır? A) WHERE B) HAVING C) ORDER BY D) DISTINCT

    2. Veri yapıları: “Son giren ilk çıkar” ilkesiyle çalışan veri yapısı hangisidir? A) Kuyruk B) Yığın C) Ağaç D) Graf

    3. Algoritmalar: Sıralı ve 1024 elemanlı bir dizide ikili arama ile bir eleman en fazla kaç karşılaştırmada bulunur? A) 10 B) 11 C) 512 D) 1024

    4. Bilgi güvenliği: Kullanıcının bir forma girdiği metnin kontrol edilmeden doğrudan veritabanı sorgusuna eklenmesiyle ortaya çıkan güvenlik açığı hangisidir? A) DDoS B) Kimlik avı (phishing) C) SQL enjeksiyonu D) Ortadaki adam saldırısı

    5. Yazılım mühendisliği: “Bir sınıfın değişmek için yalnızca tek bir nedeni olmalıdır” ilkesi SOLID’in hangi harfine karşılık gelir? A) S B) O C) L D) D

    Cevaplar: 1-B, 2-B, 3-B, 4-C, 5-A.

    Üçüncü soru için küçük bir açıklama: İkili arama her adımda aralığı yarıya indiriyor. 1024 eleman için en kötü durumda 11 karşılaştırma gerekiyor. Aynı mantığı Python Dersi 10’daki sayı tahmin oyununda kodlamıştık.

    Nasıl çalışılabilir?

    1. İlanı oku, konu listesini çıkar. Başvuracağın ilanın konu listesini bir kenara yaz ve çalışmayı ona göre planla. Bu yazıdaki tablo genel bir harita; asıl pusula ilanın kendisi.
    2. Önce ortak üçlü. Algoritmalar ve veri yapıları, veritabanı ve SQL, bilgi güvenliği. SQL için blogdaki SQL Sorularına Hazırlık serisi tam bu amaca yönelik.
    3. İngilizceyi her gün çalış. Barajlı bir bölüm olduğu için son haftaya bırakma. Okuma parçalarını teknik metinlerden seçmek, alan bilgisine de katkı sağlıyor.
    4. Genel yeteneği ihmal etme. Sayısal mantık ve problem soruları hız istiyor; düzenli süre tutarak çöz.
    5. Zamanı hesapla. İncelenen ilanlarda soru başına yaklaşık 1 ila 1,5 dakika düşüyor. Deneme çözerken bu tempoya alış.
    6. Boş bırakma stratejisini ilana göre belirle. Yanlışların doğruları götürmediği bir sınavda boş bırakmanın bir avantajı yok. Ama bu kuralı her seferinde ilandan kontrol et.

    İlanları nereden takip edersin?

    • Bankaların kendi sitelerindeki insan kaynakları ve duyurular sayfaları
    • Sınavı düzenleyen üniversitelerin sınav merkezlerinin siteleri
    • Üniversitelerin kariyer merkezleri; birçoğu ilanları kendi sitelerinde de paylaşıyor

    Başvuru süreleri genelde iki ila üç hafta, ilan ile sınav arasındaki süre de bir ay civarında olabiliyor. Başvurmayı düşünüyorsan ilanı beklemeden çalışmaya başlamak büyük avantaj.

    Bir cümlede

    Kamu bankalarının BT kadroları için kendi sınavlarını açıyor; incelenen ilanlarda KPSS istenmiyor, yazılı sınav alan bilgisi, İngilizce ve genel yetenekten oluşuyor ve üç ilanda da ortak konular algoritmalar, SQL ve bilgi güvenliği.

    Devamını oku

  • Kümeler ve Liste Üreteçleri (Python Dersi 12)

    Kümeler ve Liste Üreteçleri (Python Dersi 12)

    Bir listede kaç farklı eleman var? İki sınıfın ortak öğrencileri kimler? Geçen haftaki alışveriş listesinde olup bu haftakinde olmayanlar hangileri? Bu soruların hepsini döngülerle de çözebilirsin, ama Python’da bunlar için hazır bir veri yapısı var: küme (set). Dersin ikinci yarısında da liste, sözlük ve kümeleri tek satırda kurmanı sağlayan üreteçlere bakacağız.

    Kodların hepsi Colab’da hazır: Colab’da Aç

    Küme: tekrarsız eleman topluluğu

    Küme süslü parantezle yazılıyor ve her elemanı sadece bir kez tutuyor:

    sehirler = {"Adana", "Mersin", "Adana", "Hatay"}
    print(sehirler) # {'Hatay', 'Adana', 'Mersin'}
    print(len(sehirler)) # 3

    İki kez yazdığımız Adana bir kez kaldı. Bu özellik en çok bir listedeki tekrarları atmak için kullanılıyor:

    ziyaretler = ["Adana", "İzmir", "Adana", "Ankara", "İzmir", "Adana"]
    farkli = set(ziyaretler)
    print(farkli, len(farkli)) # {'Ankara', 'İzmir', 'Adana'} 3

    Kümede sıra yoktur

    Çıktıdaki sıranın yazdığımız sırayla aynı olmadığını fark ettin mi? Kümeler sırayı tutmaz; kodu her çalıştırdığında farklı bir sıra bile görebilirsin. Bu yüzden indeksle eleman alamazsın:

    sehirler[0]
    # TypeError: 'set' object is not subscriptable

    Sıralı bir sonuç istiyorsan sorted(sehirler) kullan; sana sıralı bir liste döndürür.

    Eklemek, silmek, aramak

    sehirler.add("Osmaniye")
    sehirler.add("Adana") # zaten var, bir şey değişmez
    sehirler.discard("Hatay")
    sehirler.discard("Rize") # yok ama hata vermez
    print("Mersin" in sehirler) # True

    remove da eleman siler, ama eleman yoksa hata verir. discard ise sessizce geçer.

    Tuzak: boş küme

    bos = set()
    print(type(bos), type({})) # <class 'set'> <class 'dict'>

    {} boş bir sözlük oluşturur, boş küme değil. Boş küme için set() yazman gerekiyor.

    Küme işlemleri

    Matematikte gördüğün birleşim, kesişim ve fark işlemleri Python’da tek bir işaretle yapılıyor:

    python_sinifi = {"Ayşe", "Mert", "Zeynep", "Can"}
    r_sinifi = {"Zeynep", "Can", "Elif"}
    print(python_sinifi | r_sinifi) # birleşim: en az birinde olanlar
    print(python_sinifi & r_sinifi) # kesişim: ikisinde de olanlar → Zeynep, Can
    print(python_sinifi - r_sinifi) # fark: sadece Python'da olanlar → Ayşe, Mert
    print(python_sinifi ^ r_sinifi) # simetrik fark: sadece birinde olanlar → Ayşe, Mert, Elif
    İşaretAdıSoru
    |BirleşimEn az birinde olanlar kimler?
    &Kesişimİkisinde de olanlar kimler?
    -FarkBirincide olup ikincide olmayanlar kimler?
    ^Simetrik farkSadece birinde olanlar kimler?

    SQL Hazırlık 1 yazısındaki “hiç çalışanı olmayan departmanlar” sorusunu hatırla. Aslında o da bir fark işlemiydi: tüm departmanlar eksi çalışanı olan departmanlar.

    Liste üreteci

    Liste üretecini kod kartında kısaca görmüştük: bir listeden yeni bir listeyi tek satırda kurmak. Hatırlayalım ve bir adım ileri gidelim:

    notlar = [70, 85, 40, 90, 45]
    gecenler = [n for n in notlar if n >= 50]
    # [70, 85, 90]
    artirilmis = [n + 5 for n in notlar]
    # [75, 90, 45, 95, 50]
    harfler = ["Geçti" if n >= 50 else "Kaldı" for n in notlar]
    # ['Geçti', 'Geçti', 'Kaldı', 'Geçti', 'Kaldı']

    Son örneğe dikkat: if sona gelirse filtreler (bazı elemanları atar). if ... else başa gelirse dönüştürür (her eleman için iki seçenekten birini seçer, hiçbirini atmaz). Bu ikisini karıştırmak liste üreteçlerindeki en sık hata.

    Sözlük ve küme üreteçleri

    Aynı yazım süslü parantezle sözlük ve küme de üretiyor:

    isimler = ["Ayşe", "Mert", "Zeynep"]
    uzunluklar = {isim: len(isim) for isim in isimler}
    # {'Ayşe': 4, 'Mert': 4, 'Zeynep': 6}
    notlar_sozluk = {"Ayşe": 85, "Mert": 45, "Zeynep": 92}
    gecenler = {isim: puan for isim, puan in notlar_sozluk.items() if puan >= 50}
    # {'Ayşe': 85, 'Zeynep': 92}
    epostalar = ["ayse@gmail.com", "mert@outlook.com", "can@gmail.com"]
    alanlar = {e.split("@")[1] for e in epostalar}
    # {'gmail.com', 'outlook.com'}

    Fark iki noktada: Başta anahtar: değer varsa sözlük, sadece tek bir değer varsa küme üretiyorsun. Son örnekte iki tane gmail.com olmasına rağmen sonuçta bir tane var, çünkü küme tekrarı tutmuyor. split("@")[1] Ders 11’den: e-postayı @ işaretinden böl, ikinci parçayı al.

    Mini program: iki listeyi karşılaştırmak

    def karsilastir(liste1, liste2):
    """İki listenin ortak, yalnızca birincide ve yalnızca ikincide olan elemanlarını döndürür."""
    a, b = set(liste1), set(liste2)
    return {
    "ortak": sorted(a & b),
    "sadece_1": sorted(a - b),
    "sadece_2": sorted(b - a),
    }
    gecen_hafta = ["süt", "ekmek", "yumurta", "peynir", "süt"]
    bu_hafta = ["ekmek", "domates", "peynir", "zeytin"]
    for ad, liste in karsilastir(gecen_hafta, bu_hafta).items():
    print(f"{ad:<9} {liste}")
    ortak ['ekmek', 'peynir']
    sadece_1 ['süt', 'yumurta']
    sadece_2 ['domates', 'zeytin']

    Aynı fonksiyonla iki kullanıcının ortak takipçilerini, iki dersin ortak öğrencilerini ya da iki veri dosyası arasında kaybolan kayıtları bulabilirsin. Veri analizinde “Bu iki listede kim var, kim yok?” sorusu sürekli karşına çıkıyor.

    Bonus: kümede aramak neden çok hızlı?

    Bir listede in ile arama yaptığında Python baştan başlayıp elemanları tek tek kontrol ediyor. Bir milyon elemanlı bir listede son elemanı aramak, bir milyon karşılaştırma demek. Küme ise elemanları özel bir yapıda (hash tablosu) tutuyor ve aranan elemana neredeyse doğrudan gidiyor.

    Not defterinde bunu ölçen bir hücre var: Aynı bir milyon sayıyı bir listede ve bir kümede 100 kez aratıyor. Kodu test ederken küme binlerce kat hızlı çıktı; senin bilgisayarında ya da Colab’da sayı farklı olacak, ama fark her zaman çok büyük. Büyük bir veride “bu eleman var mı?” sorusunu çok kez soracaksan küme kullan.

    Alıştırmalar

    1. [3, 1, 3, 2, 1, 5] listesindeki tekrarları kaldır ve sonucu küçükten büyüğe sıralı bir liste olarak yazdır.
    2. 1’den 20’ye kadar olan sayılardan 3’e bölünebilenlerin karelerini liste üreteciyle bul.
    3. “programlama” ve “algoritma” kelimelerinde ortak olan harfleri bul.
    4. {"elma": 30, "muz": 45, "kiraz": 80} sözlüğünden fiyatı 40’tan büyük olanları sözlük üreteciyle seç ve fiyatlara %10 zam yap.

    Cevaplar Colab not defterinin sonunda.

    Bu derste ne öğrendik?

    • Küme her elemanı bir kez tutar ve sıra tutmaz; indeksle eleman alınamaz.
    • Boş küme set() ile kurulur; {} boş sözlüktür.
    • |, &, -, ^ ile birleşim, kesişim, fark ve simetrik fark alınır.
    • Liste üretecinde sondaki if filtreler, baştaki if ... else dönüştürür.
    • Aynı yazımla sözlük ({k: v for ...}) ve küme ({x for ...}) üretilir.
    • Kümede in ile arama, listede aramaktan çok daha hızlıdır.

    Sıradaki ders

    Python Dersi 13’te programlarımızın hata karşısında çökmemesini sağlıyoruz: try ve except.

    Devamını oku

  • Makine Öğrenmesi ve Derin Öğrenme Arasındaki Fark

    Makine Öğrenmesi ve Derin Öğrenme Arasındaki Fark

    Yapay zekâ haberlerinde “makine öğrenmesi” ve “derin öğrenme” ifadeleri çoğu zaman aynı cümlede, hatta birbirinin yerine geçiyor. Aslında ikisi aynı şey değil, ama birbirinden bağımsız da değil. Bu yazıda farkı bir örnekle ve on satırlık bir Python koduyla netleştireceğiz.

    Kısa tanım

    • Makine öğrenmesi, bilgisayarın kuralları bizim yazmamıza gerek kalmadan, örneklerden öğrenmesini sağlayan yöntemlerin genel adı.
    • Derin öğrenme, makine öğrenmesinin bir alt dalı. Çok katmanlı yapay sinir ağlarını kullanıyor.

    Yani her derin öğrenme modeli bir makine öğrenmesi modeli, ama her makine öğrenmesi modeli derin öğrenme değil. İç içe üç halka gibi düşünebilirsin: En dışta yapay zekâ, onun içinde makine öğrenmesi, en içte derin öğrenme.

    Asıl fark: özellikleri kim seçiyor?

    Bir fotoğrafta kedi olup olmadığını anlayan bir model yapmak istediğimizi düşünelim.

    Klasik makine öğrenmesiyle önce bizim düşünmemiz gerekiyor: Bir kediyi kedi yapan ne? Kulakların şekli, bıyıklar, gözlerin konumu… Bu özellikleri fotoğraftan çıkaran kodu biz yazıyoruz. Model de bu özelliklere bakıp karar vermeyi öğreniyor. Bu adıma özellik mühendisliği (feature engineering) deniyor.

    Derin öğrenmeyle modele doğrudan fotoğrafın piksellerini veriyoruz. Sinir ağının ilk katmanları kenarları ve renk geçişlerini, sonraki katmanlar kulak ve göz gibi şekilleri, son katmanlar da “kedi yüzü” gibi bütünleri tanımayı kendi kendine öğreniyor. Hangi özelliğe bakacağını biz söylemiyoruz.

    Adındaki “derin” kelimesi de buradan geliyor: Üst üste dizilmiş çok sayıda katman.

    Python ile küçük bir karşılaştırma

    scikit-learn’ün içinde gelen el yazısı rakam veri setini kullanalım: 8×8 piksellik, 1797 rakam görüntüsü. Aynı veride bir karar ağacını ve küçük bir sinir ağını deneyelim:

    from sklearn.datasets import load_digits
    from sklearn.model_selection import train_test_split
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.neural_network import MLPClassifier
    X, y = load_digits(return_X_y=True)
    X_egitim, X_test, y_egitim, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
    agac = DecisionTreeClassifier(random_state=42).fit(X_egitim, y_egitim)
    sinir_agi = MLPClassifier(hidden_layer_sizes=(64, 32), max_iter=1000, random_state=42).fit(X_egitim, y_egitim)
    print(f"Karar ağacı: {agac.score(X_test, y_test):.0%}") # 86%
    print(f"Sinir ağı: {sinir_agi.score(X_test, y_test):.0%}") # 97%

    Aynı piksellerle karar ağacı test verisinin %86’sını, iki gizli katmanlı sinir ağı %97’sini doğru tanıdı. Karar ağacı tek tek piksellere bakıp “5. piksel koyu mu?” gibi sorular sorabiliyor. Sinir ağı ise katmanları sayesinde pikselleri bir araya getirip çizgi ve eğri gibi daha anlamlı kalıplar öğrenebiliyor.

    Dürüst bir not: İki katmanlı bu ağ gerçek dünyadaki derin öğrenme modellerinin yanında çok küçük. Yine de fikri göstermek için yeterli: Ham veride kalıp arama işinde katmanlı ağlar çok güçlü.

    Yan yana

    Klasik makine öğrenmesiDerin öğrenme
    Özellikleri kim seçiyor?Çoğunlukla insanModel kendisi öğreniyor
    Veri ihtiyacıAz ya da orta miktarda veriyle çalışabiliyorGenelde çok fazla veri istiyor
    DonanımSıradan bir bilgisayar yeterliBüyük modeller için GPU gerekiyor
    AçıklanabilirlikKarar ağacı gibi modellerin kuralları okunabiliyorNeden o kararı verdiğini anlamak zor
    Güçlü olduğu yerTablo verisi: satış, kredi, müşteri kayıtlarıGörüntü, ses, metin
    ÖrneklerKarar ağacı, rastgele orman, lojistik regresyonYapay sinir ağları, CNN’ler, Transformer’lar

    Hangisi ne zaman?

    • Elinde Excel benzeri tablo verisi varsa (müşteri yaşı, alışveriş sayısı, şehir gibi) klasik makine öğrenmesi çoğu zaman hem daha hızlı hem daha açıklanabilir bir sonuç veriyor.
    • Elinde fotoğraf, ses kaydı ya da uzun metin varsa derin öğrenme genelde çok önde.
    • Veri azsa, önce basit bir modelle başla. Basit model işini görüyorsa daha karmaşıkına geçmene gerek yok.

    Bu blogdan iki örnek: Seçmen Şapkası yazısındaki karar ağacı klasik makine öğrenmesiydi; dört puanlık bir tablo verisinden kurallar çıkardı ve o kuralları okuyabildik. Attention yazısında anlattığım Transformer modelleri ise derin öğrenmenin bugünkü en bilinen örneği; ChatGPT gibi dil modellerinin temeli bunlar.

    [AFFILIATE: makine öğrenmesine giriş kitabı ya da kursu]

    Bir cümlede

    Makine öğrenmesi bilgisayarın örneklerden öğrenmesi; derin öğrenme ise bunun, çok katmanlı sinir ağlarıyla neye bakacağını da kendi kendine öğrenen alt dalı.

    Devamını oku

  • Kod Kartı: Counter ile Kelime Saymak

    Kod Kartı: Counter ile Kelime Saymak

    Bir önceki kartta kelime sayacını get() ile kurmuştuk: boş sözlük, for döngüsü, sayac.get(k, 0) + 1. Python’un hazır gelen collections modülünde aynı işi tek satırda yapan bir araç var: Counter.

    Kod

    from collections import Counter
    kelimeler = ["python", "veri", "python", "bilim"]
    sayac = Counter(kelimeler)
    print(sayac) # Counter({'python': 2, 'veri': 1, 'bilim': 1})
    print(sayac.most_common(2)) # [('python', 2), ('veri', 1)]
    print(sayac["python"]) # 2
    print(sayac["java"]) # 0

    Counter bir listeyi alıyor ve her elemanın kaç kez geçtiğini tutan bir sözlük döndürüyor. most_common(n) en sık geçen n elemanı büyükten küçüğe veriyor. Eşit sayıları olanlar listede ilk görüldükleri sırayla geliyor; “veri”nin “bilim”den önce gelmesinin sebebi bu.

    Son satıra dikkat: Normal bir sözlükte olmayan anahtar KeyError verirdi. Counter ise 0 döndürüyor, çünkü “hiç görülmedi” ile “0 kez görüldü” aynı şey. Bu get(k, 0) ile yaptığımızın hazır hali.

    Metinde de çalışır

    Counter‘a bir metin verirsen harfleri sayar:

    print(Counter("bilgisayar").most_common(2)) # [('i', 2), ('a', 2)]

    Birkaç kullanışlı özellik

    sayac.update(["veri", "veri"]) # yeni elemanları sayıma ekle
    print(sayac) # Counter({'veri': 3, 'python': 2, 'bilim': 1})
    print(sum(sayac.values())) # 6 toplam kelime
    print(len(sayac)) # 3 farklı kelime
    a = Counter(elma=3, muz=1)
    b = Counter(elma=1, kiraz=2)
    print(a + b) # Counter({'elma': 4, 'kiraz': 2, 'muz': 1})
    print(a - b) # Counter({'elma': 2, 'muz': 1})

    İki sayacı toplayabilir ya da birinden diğerini çıkarabilirsin. Çıkarmada sıfır ya da eksi kalanlar listeden düşüyor; kirazın sonuçta olmamasının sebebi bu.

    Dikkat: saymadan önce temizle

    Counter ne verirsen onu sayar. Metni temizlemeden verirsen sonuç yanıltır:

    metin = "Python öğrenmek eğlenceli. python ile veri analizi de eğlenceli!"
    print(Counter(metin.split()).most_common(2))
    # [('Python', 1), ('öğrenmek', 1)] "Python" ile "python" farklı sayıldı
    temiz = [k.strip(".,!?").lower() for k in metin.split()]
    print(Counter(temiz).most_common(2))
    # [('python', 2), ('eğlenceli', 2)]

    Büyük-küçük harf ve noktalama yüzünden aynı kelime farklı sayılıyor. Türkçe metinlerde lower() yerine Python Dersi 11’deki tr_lower fonksiyonunu kullanmayı da unutma.

    Sözlükleri Python Dersi 8’de, get() kartını Kod Kartı #06’da, metin temizliğini Python Dersi 11’de anlattım.